Если у меня есть экземпляр класса, содержа несколько включенных модулей, я могу динамично не включать определенный модуль (Для замены его)?
Спасибо.
Это не Действительно То же самое, но вы можете подделать его с чем-то вроде этого:
module A
def hello
puts "hi!"
end
end
class B
include A
end
class C
include A
end
B.new.hello # prints "Hi!"
class Module
def uninclude(mod)
mod.instance_methods.each do |method|
undef_method(method)
end
end
end
class B
uninclude A
end
B.new.hello rescue puts "Undefined!" # prints "Undefined!"
C.new.hello # prints "Hi!"
Это может работать в общем случае, но это может укусить вас в Более сложные случаи, вроде где модуль вставляет себя в цепочку наследования, или у вас есть другие модули, предоставляющие методы, названные то же самое, что вы все еще хотите иметь возможность позвонить. Тебе также нужно будет вручную отменить все, что модуль. Включено? (KLASS)
.
Нет. Вы не можете не включить микн в языке Ruby . На некоторых реализациях Ruby Вы можете сделать это, написав определенное расширение в C или Java (или даже Ruby в случае Рубингия), хотя.
Используйте расширение Mixology C (для МРТ и Ярва): http://www.somethingnimble.com/bliki/mixology
Попробуйте http://github.com/yrashk/rbmodexcl , который обеспечивает метод unextend
для вас.
Если у вас уже включают
что-то, вы можете использовать нагрузку
, чтобы повторно включить файл. Любые определения в нагрузке
файл будут перезаписать существующие методы.