注入:NoMethodError:未定义的方法“ <<”::Symbol

时间:2019-09-20 11:50:48

标签: arrays ruby

如何正确使用注入功能并消除错误?

我正在尝试创建一个数组。这是一个例子,我知道有更好的解决方案来获得最终结果,但是我试图更好地理解注入。

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject do |sum = [], v|  # => [:one, :two, :three]
  sum << v   if v != :one  # ~> NoMethodError: undefined method `<<' for :one:Symbol\nDid you mean?  <
end

目的是添加名为sum的数组的项,该数组以空数组开始,如果项不等于:one则添加项。

2 个答案:

答案 0 :(得分:4)

您可以将sum的初始值作为参数传递。在这种情况下,初始值必须为空数组。同样,您需要确保sum是该块中的最后一个评估行。

您需要传递初始值,因为如果不这样做,则集合:one的第一个值会自动分配给sum,因此sum <<将失败(符号不会t支持<<

总而言之...如果没有默认值,则将:one分配给sum,并且该块仅对具有初始值的[:two, :three]求值,该块对集合的每个成员求值。

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject([]) do |sum, v|  
  sum << v   if v != :one
  sum 
end

答案 1 :(得分:3)

您需要在sum后返回if

a = [:one,:two,:three]  # => [:one, :two, :three]

a.inject([]) do |sum, v|  # => [:one, :two, :three]
  sum << v   if v != :one
  sum 
end