Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用lambdas和参数来收集数组?_Ruby_Lambda_Mapping_Block_Proc - Fatal编程技术网

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)
或类似的函数对我来说看起来相当不错,但我不确定是否会继续提取属性名。目标是去掉中间部分,并使用一个清晰命名的函数