Ruby 如何使用lambdas和参数来收集数组?
我很好奇如何重构这段代码:Ruby 如何使用lambdas和参数来收集数组?,ruby,lambda,mapping,block,proc,Ruby,Lambda,Mapping,Block,Proc,我很好奇如何重构这段代码: array.collect{|x| x.some_method}.inject(:+) || 0 我用不同的方法在代码中使用了大约十次,所以我认为我应该重构,但是如何重构呢 我尝试了至少十种不同的块、过程和lambda,现在我甚至不确定它是否可以重构。如何重构/重构到什么?目标是什么?您是否希望/需要超越: array.collect(&:some_method).inject(:+) || 0 如果唯一改变的是调用的方法,则将方法符号传递给方法,并在收集
array.collect{|x| x.some_method}.inject(:+) || 0
我用不同的方法在代码中使用了大约十次,所以我认为我应该重构,但是如何重构呢
我尝试了至少十种不同的块、过程和lambda,现在我甚至不确定它是否可以重构。如何重构/重构到什么?目标是什么?您是否希望/需要超越:
array.collect(&:some_method).inject(:+) || 0
如果唯一改变的是调用的方法,则将方法符号传递给方法,并在收集期间将其发送给每个对象
您试图与相关代码通信的是什么?看起来像某种总和;也许有一个简单的
sum
方法以“property”名称作为参数?Ruby习惯用法是:
array.collect(&:some_method).inject(:+)
in使用符号#to_proc method:您使用
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
第一次重构:
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)
考虑用“命名”来替换不同的部件,如<代码>和>代码>。名字很好。名称创建隐式文档。如果同一行重复多次,那么这可能也是一个很好的“命名”候选词。“重构”类型的问题可能属于这一类。有关更多信息,请参阅。+1建议使用名称。虽然:
sum people.map(&:age)
或类似的函数对我来说看起来相当不错,但我不确定是否会继续提取属性名。目标是去掉中间部分,并使用一个清晰命名的函数