如何正确使用注入功能并消除错误?
我正在尝试创建一个数组。这是一个例子,我知道有更好的解决方案来获得最终结果,但是我试图更好地理解注入。
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则添加项。
答案 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