Что такое противоположность Ruby?
Если у меня есть экземпляр класса, содержащий несколько включенных модулей, могу ли я динамически не включать конкретный модуль (чтобы его заменить)?
Спасибо.
Ответы
Ответ 1
На самом деле это не то же самое, но вы можете подделать это примерно так:
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!"
Это может работать в общем случае, но оно может укусить вас в более сложных случаях, например, когда модуль вставляет себя в цепочку наследования или у вас есть другие модули, предоставляющие методы, по имени то же самое, что вы все еще хотите быть в состоянии звонить. Вам также нужно вручную отменить все, что делает Module.included?(klass)
.
Ответ 2
Нет. Вы не можете отключить микширование на языке Ruby. На некоторых Ruby-реализациях вы можете сделать это, написав специфическое для реализации расширение на C или Java (или даже Ruby в случае Rubinius).
Ответ 3
Попробуйте http://github.com/yrashk/rbmodexcl, который предоставляет вам unextend
метод.
Ответ 4
Используйте расширение Mixology C (для MRI и YARV): http://www.somethingnimble.com/bliki/mixology
Ответ 5
Если у вас уже есть include
-ed-something, вы можете использовать load
для повторного включения файла. Любые определения в load
-ed файле будут перезаписывать существующие методы.
Ответ 6
истинный ответ - уточнение
пожалуйста, проверьте этот ответ.
fooobar.com/info/317197/...