Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么会出现系统堆栈错误?_Ruby - Fatal编程技术网

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。