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)?
-
В C-реализации rb_mod_refine мы видим
refinement = rb_module_new(); RCLASS_SET_SUPER(refinement, klass);
Это просто настройка суперкласса уточнения на
klass
, который копирует реализацию класса внутри модуля уточнения? - Я знаю, что множественное наследование IS
сделанные с помощью модулей, но что подумает сообщество об этом выше
Class#include_refined
? Было бы разумным извлечь этот аспект из уточнений? "Локально" исправление внутри класса вместо использования "использования" переключателей для активации уточнений?