5

再帰的なメソッド呼び出しを検出するための最良の方法は何ですか?おそらく、次の形式にすることができます。

def foo
  if some_code_to_detect_recursive_call
    ...
  else
    ...
  end
end

情報を解析する方法を考えることはできますが、callerもっと良い方法があるかどうかに興味があります。

4

2 に答える 2

4

メソッドに入力した後、カウンター(インスタンスまたはグローバル変数)をインクリメントし、終了時にデクリメントするだけです。

エントリ時に、カウンターは再帰レベルを示します。

于 2013-01-29T04:47:30.080 に答える
1
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"
于 2021-01-14T14:46:55.750 に答える