Lio*_*rom 3 ruby arrays ruby-on-rails ruby-on-rails-3
我仍然是一个红宝石新手,我正在努力学习如何使用该inject方法.
通过使用该inject方法,我试图在给定的字符串中返回一个字母数组及其外观,如下所示:
def sorting(str)
str.split("").uniq.map { |letter|
[letter, str.split("").inject(0) { |sum, char| sum + 1 if letter == char }]
}
end
p sorting("aaabdbbcccaaabcacba")
Run Code Online (Sandbox Code Playgroud)
欲望的结果应该是:
[["a", 8], ["b", 5], ["d", 1], ["c", 5]]
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到了一个错误:undefined method '+' for nil:NilClass.
我做错了什么,如何使用它inject和它的总和优势来解决它?
使用Enumerable#group_by似乎更合适:
>> "aaabdbbcccaaabcacba".chars.group_by { |x| x }.map { |key, a| [key, a.size] }
=> [["a", 8], ["b", 5], ["d", 1], ["c", 5]]
Run Code Online (Sandbox Code Playgroud)
传递给inject的块不关心不匹配的字符.
替换sum + 1 if letter == char为letter == char ? sum + 1 : sum:
def sorting(str)
str.split("").uniq.map { |letter|
[letter, str.split("").inject(0) { |sum, char| letter == char ? sum + 1 : sum }]
}
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1796 次 |
| 最近记录: |