传递方法来减少或注入而不是像这样的块的最佳方法是什么:
def super_process(list, item)
list ||= []
list << another_method(item) + just_another_method
end
arr = ['1', '2', '3']
arr.reduce(&method(:super_process))
我在处理list
时遇到问题(它的默认值)。它在第一次迭代时被分配给arr
的第一个元素,但是在下一次迭代中,它被分配给第一次迭代的结果。
我知道我可以写:
arr.reduce {|list, item| list << another_method(list, item) }
但这对我来说似乎很长并且没有意义。
答案 0 :(得分:5)
您的示例中的问题是由于未将初始值传递给reduce
。来自ruby-doc.org:
reduce { |memo, obj| block } → obj
...
如果没有明确指定备忘录的初始值,那么 第一个集合元素用作备忘录的初始值。
因此,您可能希望将数组作为第一个参数传递。我已将super_process
的定义更改为更简单的内容:
def super_process list, item
list.push item + 1
end
arr = [1, 2, 3]
res = arr.reduce [], &method(:super_process)
puts res
这将输出
2
3
4