再帰的なメソッド呼び出しを検出するための最良の方法は何ですか?おそらく、次の形式にすることができます。
def foo
if some_code_to_detect_recursive_call
...
else
...
end
end
情報を解析する方法を考えることはできますが、caller
もっと良い方法があるかどうかに興味があります。
メソッドに入力した後、カウンター(インスタンスまたはグローバル変数)をインクリメントし、終了時にデクリメントするだけです。
エントリ時に、カウンターは再帰レベルを示します。
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"
"case #1"
"case #1"
"case #2.1"
"case #2.2"
"case #2.1"
"case #2.2"
"case #2.1"
"case #2.2"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"case #3"
"If you see this: is_recursive function implemented correctly"