Рубиновый экземпляр Eval - PullRequest
2 голосов
/ 16 декабря 2009
class Setter
    attr_accessor :foo

    def initialize
        @foo = "It aint easy being cheesy!"
    end

    def set
        self.instance_eval { yield if block_given? }
    end
end

options = Setter.new

# Works
options.instance_eval do
    p foo
end

# Fails
options.set do
    p foo
end

Почему метод set не работает?

EDIT

Разобрался ...

def set
    self.instance_eval { yield if block_given? }
end

Необходимо быть:

def set(&blk)
    instance_eval(&blk)
end

1 Ответ

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

Да - yield оценивает в контексте, в котором он был определен.

Хорошо, напишите здесь , но простой пример показывает проблему:

>> foo = "wrong foo"
>> options.set do
?>     p foo
>> end
"wrong foo"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...