Что является противоположностью Рубина? - PullRequest
16 голосов
/ 18 января 2010

Если у меня есть экземпляр класса, содержащий несколько включенных модулей, могу ли я динамически отключить конкретный модуль (для его замены)?

Спасибо.

Ответы [ 6 ]

6 голосов
/ 18 января 2010

Это не на самом деле одно и то же, но вы можете подделать что-то вроде этого:

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).

5 голосов
/ 18 января 2010

Нет. Вы не можете отключить миксин в Ruby Language . В некоторых Ruby Реализациях вы можете сделать это, написав расширение для конкретной реализации на C или Java (или даже Ruby в случае Rubinius).

4 голосов
/ 18 января 2010

Попробуйте http://github.com/yrashk/rbmodexcl,, который предоставляет метод unextend для вас.

2 голосов
/ 19 января 2010

Используйте расширение Mixology C (для МРТ и ЯРВ): http://www.somethingnimble.com/bliki/mixology

1 голос
/ 20 января 2010

Если у вас уже есть include -ед, вы можете использовать load для повторного включения файла. Любые определения в файле load перезаписывают существующие методы.

0 голосов
/ 30 марта 2015

истинный ответ - утонченность

пожалуйста, проверьте этот ответ.

https://stackoverflow.com/a/19462745/1409600

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...