refine
in Ruby 旨在处理猴子修补和继承问题,其目的是将猴子修补限制在特定命名空间内的类实例上。
这些相同的继承问题不适用于模块,因为模块可以使用 mixin 扩展或包含在其他模块(而不是类)中。
这将允许通过创建一个新模块来限制猴子修补的名称空间,该模块在其自己的名称空间内扩展并覆盖原始模块。
如果使用您的示例:
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
( MyModule
is NOT a class) 的实例,因此这种方法非常有效。
类是不可能的,因为除其他原因外,类实例可能不限于使用它们的模块的命名空间......因此,对于类实例,refine
应该使用。