Подтвердить что ты не робот

Что такое противоположность Ruby?

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

Спасибо.

4b9b3361

Ответ 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).

Ответ 5

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

Ответ 6

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

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

fooobar.com/info/317197/...