如何在Ruby中正确使用inject方法

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和它的总和优势来解决它?

fal*_*tru 7

使用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 == charletter == 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)