6

我正在尝试计算数组中元素的出现次数并将其保存在哈希中。我想使用注入功能。我有这个代码:

a = ["the","the","a", "it", "it", "it"]
a.inject(Hash.new(0)) {|hash,word| hash[word] += 1}

我不明白为什么会出现以下错误:

TypeError: can't convert String into Integer
    from (irb):47:in `[]'
    from (irb):47:in `block in irb_binding'
    from (irb):47:in `each'
    from (irb):47:in `inject'

另外,我不知道如何解决它。

4

1 回答 1

10

inject用两个参数调用你的块,备忘录和当前元素。然后它获取块的返回值并用它替换备忘录。您的块返回整数。所以,在第一次迭代之后,你的备忘录不再是一个散列,它是一个整数。并且整数在其索引器中不接受字符串。

修复很简单,只需从块中返回哈希。

a = ["the","the","a", "it", "it", "it"]
a.inject(Hash.new(0)) {|hash,word| hash[word] += 1; hash }

您可能更喜欢each_with_object它,因为它不会取代备忘录。请注意,each_with_object接受反向参数(元素第一,备忘录第二)。

a.each_with_object(Hash.new(0)) {|word, hash| hash[word] += 1}
于 2013-05-31T15:24:31.860 回答