Module#refine
方法接受一个类和一个块并返回一个细化模块,所以我想我可以定义:
class Class
def include_refined(klass)
_refinement = Module.new do
include refine(klass) {
yield if block_given?
}
end
self.send :include, _refinement
end
end
并且以下测试通过
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
因此,使用细化,我可以将一个类变成一个模块,动态地细化其行为,并将其包含在其他类中。
- 有没有更简单的方法可以将一个类变成 Ruby 中的一个模块(比如在 ruby < 2 中)?
在rb_mod_refine的 C 实现中, 我们看到
refinement = rb_module_new(); RCLASS_SET_SUPER(refinement, klass);
这只是将细化的超类设置为
klass
复制细化模块内的类的实现吗?- 我知道多重继承是通过模块完成的,但是社区会如何看待上述内容
Class#include_refined
?从改进中提取这方面是否合理?“本地”修补类内部而不是使用“使用”开关来激活细化?