Почему я получаю «слишком большой уровень стека» из method_missing в irb 1.9.3? - PullRequest
3 голосов
/ 29 февраля 2012

Сценарий:

-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, вызывают ошибку.

1 Ответ

9 голосов
/ 29 февраля 2012

Похоже, определение его как единственного метода работает:

def self.method_missing(sym, *args); @v[sym]; end

Определение его как метода верхнего уровня заменяет BasicObject # method_missing, что, вероятно, затронуло некоторые внутренние компоненты irb, такие как Phrogz.

...