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
答案 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。