【问题标题】:using inject to count elements in array使用注入计算数组中的元素
【发布时间】:2013-05-27 11:26:33
【问题描述】:

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

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'

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

【问题讨论】:

标签: ruby arrays inject


【解决方案1】:

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}

【讨论】:

  • 可能很好的答案,但为了自学,我会问你 - each_with_object 接受反向参数(元素第一,备忘录第二)。 那么这种反向顺序如何帮助,@ 987654326@ 没有。我可以在这方面有更多的味道吗?
  • 这不是帮助的顺序。就是each_with_object 不能代替备忘录。
  • @RubyLovely 订单与它无关,这只是each_with_object 的工作方式。
  • 现在从 each_with_object doesn't replace memo这行开始有意义了..暂时忘记了..谢谢 Buddy :)
  • @RubyLovely inject 不返回 1; hash[word] += 1 确实如此。
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多