Ruby中的堆栈级别太深

前端之家收集整理的这篇文章主要介绍了Ruby中的堆栈级别太深前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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

解决方法

代码的问题是在times()内定义的数字变量不属于method_missing()范围.因此,当执行该行时,Ruby会将其解释为对self的方法调用.

在正常情况下,您应该获得NoMethodError异常.但是,由于您已经为MyClass重写了method_missing()方法,因此不会出现此异常.相反,直到堆栈溢出方法调用number().

要避免此类问题,请尝试指定允许的方法名称.例如,假设您只需要在MyClass上调用try,test和my_method方法,然后在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

如果你真的不需要method_missing(),请避免使用它.有一些很好的替代品here.

猜你在找的Ruby相关文章