Как создать метод динамически в ruby ​​с define_method, в зависимости от одной переменной экземпляра? - PullRequest
0 голосов
/ 16 ноября 2018

Я просто не получил ответ на этот вопрос.Я хочу создать метод динамически с условием ввода в момент экземпляра объекта.Я могу создать метод с другими условиями, которые я тестировал, но в других обстоятельствах он просто не работает.Вот мой код:

class Animal
  def initialize(live, swim)
    @live = live
    @swim = swim
  end
  def live?
    @live
  end
  def swim?
    @swim
  end
end

class Bird < Animal
  def initialize(live, swim, fly)
    super(live, swim)
    @fly = fly
  end

  define_metod(:flying) {puts "flying high"} if @fly
end

Bird.new(true, true, true).flying

Я пробовал еще несколько других способов сделать это.Ошибка в том, что метод «Полет» не создан:

Traceback (most recent call last):
main.rb:23:in `<main>': undefined method `flying' for #<Bird:0x000056382015df98 @live=true, @swim=true, @fly=true> (NoMethodError)

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Если вы все еще хотите это сделать, попробуйте вот так (упрощенный пример):

class A
  def initialize(foo)
    define_singleton_method(:flying) { "flying high" } if foo
  end
end

Тогда:

> A.new(true).flying
 => "flying high"
> A.new(false).flying
NoMethodError: undefined method `flying' for #<A:0x0000000589a148 @foo=false>
  from (irb):24

Таким образом, define_singleton_method оценивается в пределахконтекст конкретного экземпляра класса, а не сам класс, поэтому вы сможете использовать любые переменные экземпляра экземпляра, какие пожелаете.

0 голосов
/ 16 ноября 2018

@fly в define_method(:flying) {puts "flying high"} if @fly является переменной экземпляра класса .Он не существует, когда на него ссылаются (когда анализируется код), поэтому возвращается nil, в результате чего оператор define_method не выполняется.Переменная экземпляра класса @fly не связана с переменными экземпляра @fly, так же как @fly для одного экземпляра не связана с @fly для другого экземпляра.

См. Ответ @ Marcin о том, как вы можете достичьваша цель.

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