0
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!

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

4

2 回答 2

3

实际上x是 aself所以你可以像这样重写它:

module CallableDict
  def method_missing method
    puts self["#{method}"]
  end
end
于 2012-04-28T12:08:24.130 回答
0

在 的实现中method_missingx被视为方法名称,因为 Ruby 没有将其视为x正确范围内的变量。当解释器看到x["#{method}"]时,它认为您正在索引一个散列或其他从一个名为 的方法返回的对象x。因为没有方法被调用x,Ruby 调用 your method_missing,它再次调用自己,重复这个过程,直到 Ruby 遇到堆栈溢出。

修复很简单。正如上面@nash 所说,您必须替换xself,因为在 中method_missing名称 x没有意义,但名称 self是相同的引用(在 C 术语中,它们是相同的指针)。此外,您可以通过在以下实现中执行此操作来使代码更具可读性method_missing

puts self[method.to_s]
于 2012-04-28T13:57:18.813 回答