Какова противоположность Ruby, включают?

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

Спасибо.

16
задан QAZ 18 January 2010 в 18:22
поделиться

5 ответов

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

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

-
6
ответ дан 30 November 2019 в 22:31
поделиться

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

5
ответ дан 30 November 2019 в 22:31
поделиться

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

2
ответ дан 30 November 2019 в 22:31
поделиться

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

4
ответ дан 30 November 2019 в 22:31
поделиться
-- 4518492-

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

1
ответ дан 30 November 2019 в 22:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: