Ruby中的堆栈级别太深

时间:2012-03-17 04:24:10

标签: ruby stack-overflow

class MyClass
  def method_missing(name, *args)
    name = name.to_s
    10.times do
      number = rand(100)
    end
    puts "#{number} and #{name}"
  end  
end

您好,我正在运行ruby但是在这个非递归函数中,当使用这段代码时,我得到堆栈级别太深的错误。

x = MyClass.New
x.try

1 个答案:

答案 0 :(得分:11)

您的代码存在问题,number内定义的times()变量属于method_missing()范围。因此,当执行该行时,Ruby会将其解释为self上的方法调用。

在正常情况下,您应该获得NoMethodError例外。但是,由于您已覆盖method_missing()的{​​{1}}方法,因此不会出现此异常。相反,直到堆栈溢出方法MyClass)被调用。

要避免此类问题,请尝试指定允许的方法名称。例如,假设您只需要在number(上调用try, test, and my_method方法,然后在MyClass上指定这些方法名称以避免此类问题。

举个例子:

method_missing()

如果您确实不需要class MyClass def method_missing(name, *args) name = name.to_s super unless ['try', 'test', 'my_method'].include? name number = 0 10.times do number = rand(100) end puts "#{number} and #{name}" end end ,请避免使用它。有一些很好的选择here