Module#refine method接受一个类和一个块并返回一个细化模块,所以我想我可以定义:
class Class
def include_refined(klass)
_refinement = Module.new do
include refine(klass) {
yield if block_given?
}
end
self.send :include, _refinement
end
end
Run Code Online (Sandbox Code Playgroud)
并且以下测试通过
class Base
def foo
"foo"
end
end
class Receiver
include_refined(Base) {
def foo
"refined " + super
end
}
end
describe Receiver do
it { should respond_to(:foo) }
its(:foo) { should eq("refined foo") }
end
Run Code Online (Sandbox Code Playgroud)
因此,使用细化,我可以将类转换为模块,动态改进其行为,并将其包含在其他类中.
在rb_mod_refine的C实现中 我们看到了
refinement = rb_module_new();
RCLASS_SET_SUPER(refinement, klass);
Run Code Online (Sandbox Code Playgroud)
这只是将精炼的超类设置为klass复制模块中的类的实现吗?
Class#include_refined?从改进中提取这个方面是否合理?在本地"修补"而不是使用"使用"开关激活优化?