1

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

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

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

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

4

4 回答 4

2

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

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

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

你想与有问题的代码沟通什么?看起来像是某种总结;也许是一个sum以“属性”名称作为参数的简单方法?

于 2013-02-14T20:20:02.983 回答
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)
于 2013-02-14T21:23:44.027 回答
0

Ruby 习惯用法是:

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

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

于 2013-02-14T20:21:09.410 回答
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
于 2013-02-14T20:23:02.080 回答