method_missing в instance_eval - PullRequest
       27

method_missing в instance_eval

2 голосов
/ 17 декабря 2009

Полный код: http://friendpaste.com/5TdtGPZaEK0DbDBa2DCUyB

class Options
    def method_missing(method, *args, &block)
        p method
    end
end

options = Options.new

options.instance_eval do
    foo
    foo = "It aint easy being cheesy!"
end

puts "#===---"
options.foo
options.foo = "It still aint easy being cheesy!"

Возвращает:

:foo
#===---
:foo
:foo=

Поскольку он обрабатывает foo = "" как локальную переменную в instance_eval, он не распознает его как метод.

Как мне заставить instance_eval рассматривать его как метод?

Ответы [ 2 ]

5 голосов
/ 17 декабря 2009

Выражение foo = "" никогда не будет вызовом метода. Это присвоение локальной переменной. Это факт синтаксиса Руби. Чтобы вызвать сеттер, вы должны явно указать получателя. Вот почему большинство псевдо-DSL на Ruby используют стиль Двемти:

class Dragon < Creature
  life 1340     # tough scales
  strength 451  # bristling veins
  charisma 1020 # toothy smile
  weapon 939    # fire breath
end

Это позволяет избежать проблемы знака равенства.

2 голосов
/ 17 декабря 2009

Сделайте self.foo = "", чтобы он воспринимал это как метод.

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