如何使用带参数的lambdas来收集数组?

时间:2013-02-14 20:17:31

标签: ruby lambda mapping block proc

我很好奇我如何重构这段代码:

array.collect{|x| x.some_method}.inject(:+) || 0

我的代码中有十次使用不同的方法,所以我认为我应该重构,但是如何?

我尝试了至少十种块,procs和lambdas,此时我甚至不确定它是否可以重构。

4 个答案:

答案 0 :(得分:2)

重构如何/到什么?目标是什么?你想要/需要超越:

array.collect(&:some_method).inject(:+) || 0

如果唯一改变的是被调用的方法,则将方法符号传递给方法,并在收集过程中将其发送给每个对象。

您正在尝试与相关代码进行通信?看起来像某种总结;也许是一个简单的sum方法,其中“属性”名称作为参数?

答案 1 :(得分:1)

第一个重构:

array.collect(&:some_method).inject(0, :+)

第二个重构,摘要:

module Enumerable
  def sum(method)
    block_given? ? inject(0) { |acc, x| acc + yield(x) } : inject(0, :+)
  end
end

array.map(&:some_method).sum
array.sum(&:some_method)

答案 2 :(得分:0)

Ruby的习语是使用:

array.collect(&:some_method).inject(:+)

使用Symbol#to_proc方法:http://www.ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc

答案 3 :(得分:0)

您使用array.collect(&:some_method).inject(:+)作为初学者。您也可以通过inject一次调用来执行此操作:

def my_method(ary, method_symbol)
  ary.inject (0) do |sum, elem|
    sum + elem.send( method_symbol )
  end
end