Ruby中的堆栈级别太深

Pry*_*est 6 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
Run Code Online (Sandbox Code Playgroud)

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

x = MyClass.New
x.try
Run Code Online (Sandbox Code Playgroud)

emr*_*azi 11

您的代码的问题是number内部定义的变量times()超出method_missing()范围.因此,当执行该行时,Ruby会将其解释为方法调用self.

在正常情况下,你应该得到NoMethodError例外.但是,由于您具有覆盖method_missing()方法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
Run Code Online (Sandbox Code Playgroud)

如果您不需要method_missing(),请避免使用它.有一些很好的选择这里.