Сценарий:
-bash-3.2$ irb -f
ruby-1.9.3-p0 :001 > @v = {}
=> {}
ruby-1.9.3-p0 :002 > def method_missing(sym, *args); @v[sym]; end
=> nil
ruby-1.9.3-p0 :003 > a
(irb):2: stack level too deep (SystemStackError)
-bash-3.2$
Я запустил с -f, чтобы избежать загрузки каких-либо файлов irbrc.Я ожидаю получить ноль при вводе a
.Что происходит, и есть ли обходной путь?Я попытался обернуть a
блоком begin
/ rescue Exception
, но это ничего не дало.
Это также происходит с 1.9.2, но не с 1.9.1.
Более странное поведение:
-bash-3.2$ irb -f
irb(main):001:0> @v = {}
=> {}
irb(main):002:0> def method_missing(sym, *args); @v[sym]; end; 5.times { p a }
nil
nil
nil
nil
nil
=> 5
irb(main):003:0> a
(irb):2: stack level too deep (SystemStackError)
-bash-3.2$
Это говорит мне о том, что в irb есть ошибка или что неясная ошибка в ruby вызывается irb.Кроме того, после определения method_missing даже такие методы, как local_variables
или eval
, вызывают ошибку.