检测递归方法调用的最佳方法是什么?也许,它可以制成这种格式:
def foo
if some_code_to_detect_recursive_call
...
else
...
end
end
我可以想出解析caller
信息的方法,但我有兴趣看看是否有更好的方法。
答案 0 :(得分:3)
只需在输入方法后递增计数器(实例或全局变量),然后在退出时递减计数器。
在输入时,计数器会告诉您递归级别。
答案 1 :(得分:1)
A B C
0 a c x
1 a c x
2 a d z
3 b d y
4 b d y
def is_recursive(max_recursive_calls=2)
calls = caller.inject(0) do |calls, line|
break calls if calls >= max_recursive_calls
calls += 1 if line == caller[-2]
calls
end
calls >= max_recursive_calls
end
# 1
def recursive
p "case #1"
recursive unless is_recursive
end
# 2
def recursive_a
p "case #2.1"
recursive_b unless is_recursive
end
def recursive_b
p "case #2.2"
recursive_a unless is_recursive
end
# 3
def recursive_cond(iter=0, limit=10)
p "case #3"
recursive_cond(iter + 1, limit) unless iter > limit || is_recursive(50)
end
recursive
recursive_a
recursive_b
recursive_cond
p "If you see this: is_recursive function implemented correctly"