Ruby 为什么会出现系统堆栈错误?
上面的代码是我的模块,它使哈希键可以调用。当我运行它的时候Ruby 为什么会出现系统堆栈错误?,ruby,Ruby,上面的代码是我的模块,它使哈希键可以调用。当我运行它的时候 module CallableDict def method_missing method puts x["#{method}"] end end 我得到以下信息 require 'callabledict' x = {"foo" => "ruby"} x.extend CallableDict x.foo 为什么??Hpw我能解决这个问题吗?实际上x是一个self所以你可以这样重写它: SystemStack
module CallableDict
def method_missing method
puts x["#{method}"]
end
end
我得到以下信息
require 'callabledict'
x = {"foo" => "ruby"}
x.extend CallableDict
x.foo
为什么??Hpw我能解决这个问题吗?实际上
x
是一个self
所以你可以这样重写它:
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!
实际上,
x
是一个self
,因此您可以这样重写它:
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!
在
method\u missing
的实现中,x
被视为一个方法名,因为Ruby在正确的范围内没有将x
视为一个变量。当解释器看到x[“#{method}”]
时,它认为您正在索引到一个散列或从名为x
的方法返回的其他对象。由于没有名为x
的方法,Ruby会调用您的方法\u missing
,它会再次调用自己,重复这个过程,直到Ruby遇到堆栈溢出
解决办法很简单。如上@nash所述,您必须将x
替换为self
,因为在method\u missing
中,名称x
没有意义,但名称self
是相同的引用(在C术语中,它们是相同的指针)。此外,您还可以在方法\u missing
的实现中这样做,使代码更具可读性:
module CallableDict
def method_missing method
puts self["#{method}"]
end
end
在
method\u missing
的实现中,x
被视为一个方法名,因为Ruby在正确的范围内没有将x
视为一个变量。当解释器看到x[“#{method}”]
时,它认为您正在索引到一个散列或从名为x
的方法返回的其他对象。由于没有名为x
的方法,Ruby会调用您的方法\u missing
,它会再次调用自己,重复这个过程,直到Ruby遇到堆栈溢出
解决办法很简单。如上@nash所述,您必须将x
替换为self
,因为在method\u missing
中,名称x
没有意义,但名称self
是相同的引用(在C术语中,它们是相同的指针)。此外,您还可以在方法\u missing
的实现中这样做,使代码更具可读性:
module CallableDict
def method_missing method
puts self["#{method}"]
end
end
我猜你在
method\u missing
中调用x
,这是一个递归调用,因为它也一次又一次调用x。我猜你在method\u missing
中调用x
,这是一个递归调用,因为它也一次又一次调用x。