@v = {} => {} ruby-1.9.3-p0 :002 > def method_missing(sy-6ren">
gpt4 book ai didi

ruby - 为什么我在 irb 1.9.3 中从 method_missing 得到 "stack level too deep"?

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:32 24 4
gpt4 key购买 nike

场景:

-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 时得到 nil。这是怎么回事,有解决方法吗?我尝试用 begin/rescue Exception block 包装 a 但那没有做任何事情。

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 中存在错误,或者 irb 触发了 ruby​​ 中的一些不明显的错误。此外,在定义 method_missing 之后,即使像 local_variableseval 这样存在的方法也会导致错误。

最佳答案

看起来将其定义为单例方法是可行的:

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

将其定义为顶级方法取代了 BasicObject#method_missing,这可能会影响某些 irb 内部结构,如 Phrogz 所说。

关于ruby - 为什么我在 irb 1.9.3 中从 method_missing 得到 "stack level too deep"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9491462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com