1

このコードをリファクタリングする方法に興味がありました:

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

さまざまな方法でコードに約10回あるので、リファクタリングする必要があると思いましたが、どうすればよいですか?

少なくとも 10 種類のブロック、プロシージャ、ラムダを試しましたが、現時点ではリファクタリングできるかどうかさえわかりません。

4

4 に答える 4

2

どのように/何をリファクタリングしますか? 目標は何ですか?超えたい/必要がありますか:

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

変更されるのが呼び出されるメソッドだけである場合は、メソッド シンボルをメソッドに渡し、コレクション中に各オブジェクトに送信します。

問題のコードと何を通信しようとしていますか? ある種の総和のように見えます。おそらく、sum「プロパティ」名をパラメーターとして持つ単純なメソッドですか?

于 2013-02-14T20:20:02.983 に答える
1

最初のリファクタリング:

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

2 番目のリファクタリング、概要:

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次のように 1 回の呼び出しで実行することもできます。

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 に答える