5

to_proc改良で定義されたメソッドでは機能しないようです:

module ArrayExtensions
  refine Array do
    def sum
      reduce(0, :+)
    end
  end
end

using ArrayExtensions

puts [[1, 2, 3]].map { |array| array.sum } # => 6
puts [[1, 2, 3]].map(&:sum) # => array.rb:13:in `map': undefined method `sum' for [1, 2, 3]:Array (NoMethodError)
puts [1, 2, 3].method(:sum).to_proc.call # => array.rb:14:in `method': undefined method `sum' for class `Array' (NameError)

これは意図した動作ですか?回避策はありますか?

4

2 に答える 2

1

もちろん意図したものです。改良のスコープは、モジュール ブロックまたはusing呼び出されたファイルのいずれかです。では、(&:sum)(明示的に) メソッドを呼び出していませんsum。そこにはシンボルしかありません:sum。を使用すると、Ruby C 実装のどこかで呼び出しが行われSymbol#to_procます。その環境は、あなたの精錬が効果的でない場所です。

回避策は、そのファイル内でメソッドを明示的に呼び出すことです。

于 2016-02-11T07:59:54.893 に答える