refine
Ruby の は、モンキー パッチと継承の問題に対処することを目的としています。この目的は、モンキー パッチを特定の名前空間内のクラスのインスタンスに限定することです。
モジュールは、ミックスインを使用して (クラスではなく) 他のモジュール内に拡張または含めることができるため、これらの同じ継承の問題は、同じ方法でモジュールに適用されるわけではありません。
これにより、独自の名前空間内で元のモジュールを拡張およびオーバーライドする新しいモジュールを作成することで、モンキー パッチの名前空間の制限が可能になります。
あなたの例を使用する場合:
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
を使用する必要があります。