Kel*_*vin 3 ruby irb method-missing
场景:
-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$
Run Code Online (Sandbox Code Playgroud)
我用-f运行以避免加载任何irbrc的东西.当我输入时,我期待得到零a.发生了什么,是否有解决方法?我尝试a用begin/ rescue Exceptionblock 包装,但没有做任何事情.
这也发生在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$
Run Code Online (Sandbox Code Playgroud)
这告诉我irb中存在一个错误,或者irb触发了红宝石中一些模糊的错误.此外,在定义method_missing之后,甚至存在类似local_variables或eval导致错误的方法.
看起来像将其定义为单例方法一样有效:
def self.method_missing(sym, *args); @v[sym]; end
Run Code Online (Sandbox Code Playgroud)
将它定义为顶级方法取代了BasicObject#method_missing,这可能会影响一些irb内部,如Phrogz所说.
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |