4

洗練状態に関するRubyドキュメント

絞り込みはモジュールではなくクラスのみを変更するため、引数はクラスでなければなりません。

どうしてこれなの?

モジュールにモンキー パッチを適用することは可能です。

module MyModule
  def my_method
    "hello"
  end
end

include MyModule
puts my_method # => hello

module MyModule
  def my_method
    "goodbye"
  end
end

puts my_method # => goodbye

これは良い考えではないと思いますが、そのようなモンキー パッチの範囲を制限できれば、それほど悪くはないかもしれません。では、なぜできないのですか?

4

2 に答える 2

0

refineRuby の は、モンキー パッチと継承の問題に対処することを目的としています。この目的は、モンキー パッチを特定の名前空間内のクラスのインスタンスに限定することです。

モジュールは、ミックスインを使用して (クラスではなく) 他のモジュール内に拡張または含めることができるため、これらの同じ継承の問題は、同じ方法でモジュールに適用されるわけではありません。

これにより、独自の名前空間内で元のモジュールを拡張およびオーバーライドする新しいモジュールを作成することで、モンキー パッチの名前空間の制限が可能になります。

あなたの例を使用する場合:

module MyModule
  def my_method
    "hello"
  end
end

include MyModule

puts my_method
# => hello

module MyOtherModule
  extend MyModule

  puts my_method # will print: hello

  def my_method
    "goodbye"
  end
  extend self

  puts my_method # will print: goodbye
end
# => hello
# => goodbye

puts my_method
# => hello

ご覧のとおり、「monkey-patch」をMyOtherModule使用せずに名前空間に制限することができましたrefine

MyModule( is NOT a class) のインスタンスを使用していないためMyModule、このアプローチは完全に機能します。

他の理由の中で、クラスインスタンスは、それらが使用されるモジュールの名前空間に限定されない可能性があるため、クラスでは同じことができません...したがって、クラスインスタンスには、refineを使用する必要があります。

于 2015-10-12T05:40:50.983 に答える