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(),请避免使用它.有一些很好的选择这里.