为什么我会收到SystemStackError?

时间:2012-04-28 11:52:40

标签: ruby

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!

为什么呢?我可以解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

实际上xself所以你可以像这样重写它:

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]