module CallableDict
def method_missing method
puts x["#{method}"]
end
end
上面的代码是我的模块,它使哈希键可以调用。我跑的时候虽然......
require 'callabledict'
x = {"foo" => "ruby"}
x.extend CallableDict
x.foo
我得到以下内容......
SystemStackError: stack level too deep
from /Users/Solomon/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/irb/workspace.rb:80
Maybe IRB bug!
为什么呢?我可以解决这个问题吗?
答案 0 :(得分:3)
实际上x
是self
所以你可以像这样重写它:
module CallableDict
def method_missing method
puts self["#{method}"]
end
end
答案 1 :(得分:0)
在method_missing
的实现中,x
被视为方法名称,因为Ruby没有将x
视为正确范围内的变量。当解释器看到x["#{method}"]
时,它认为您正在索引从名为x
的方法返回的哈希或其他对象。因为没有名为x
的方法,所以Ruby调用你的method_missing
,它再一次调用自己,重复这个过程,直到Ruby遇到堆栈溢出。
修复很简单。如上所述@nash,您必须将x
替换为self
,因为在method_missing
中,名称 x
没有任何意义,但< em> name self
是相同的引用(在C术语中,它们是相同的指针)。此外,通过在method_missing
:
puts self[method.to_s]