Короче, нет. После того, как вы вызвали yield
, эти переменные, определенные в блоке, ушли (вроде, как мы увидим), за исключением того, что возвращается - именно так работает объем. В вашем примере, 5
все еще существует в том смысле, что оно возвращается блоком, и, таким образом, puts yield
будет печатать 5
. Используя это, вы можете вернуть хеш из блока {:a => 5}
, а затем получить доступ к нескольким «переменным» таким образом. В Ruby 1.8 (в IRb только ) вы можете сделать:
eval "a = 5"
a # => 5
Хотя я в любом случае не знаю eval
содержимого блока. Несмотря на это, в Ruby 1.9 область действия eval
была изолирована , и это даст вам NameError
. Вы можете сделать eval
в контексте Binding
, хотя:
def foo
b = yield
eval(a, b) + 2
end
foo do
a = 5
binding
end # => 7
Мне кажется, что вы пытаетесь эмулировать макросы в Ruby, что просто невозможно (, по крайней мере, не чистый Ruby ), и я не рекомендую использовать любой из " Обходные пути "Я упоминал выше.