传递方法来减少/注入而不是阻塞

时间:2014-03-20 13:02:48

标签: ruby

传递方法来减少或注入而不是像这样的块的最佳方法是什么:

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) }

但这对我来说似乎很长并且没有意义。

1 个答案:

答案 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