3

Ruby を使い始めたばかりですが、使用しているマニュアルが古くなっているようです。いろいろ調べてみましたが、明確な答えが見つかりませんでした。

マニュアルでは、ループとして機能するメソッド内で「retry」キーワードを使用していましたが、begin/rescue ブロックなしで使用されており、「retry」キーワードを強制的に begin 内に配置すると、動作がかなり異なるように見えます。 /レスキューブロック。

私は多くのことを試みました: リトライ; 終わり;'。-最後のものは、'begin/rescue' ブロックを外部で使用し、メソッドの呼び出しをラップしていました。

マニュアルのロジックに従って、最後のものだけが正常に機能しました。

いくつかの例があります:

マニュアルのコードは次のとおりです。

def WHILE(cond)
  return if not cond
  yield
  retry
end
i=0; WHILE(i<3) {print i; i+=1}

結果: 012

私は次のことを試しました:

def WHILE(cond)
  begin
    return if not cond
    yield
    raise
  rescue
    retry
  end
end
i=0; WHILE(i<3) {print i; i+=1}

結果: 無限の数

def WHILE(cond)
  return if not cond
  yield
end
i=0; begin; WHILE(i<3) {print i; i+=1}; raise; rescue; retry; end

結果:012 (さらに、何も出力しない明らかな無限ループ)

この実存的な疑いからあなたが私を連れて行ってくれることを期待していますが、これが私の結論です.

「retry」キーワードの begin/rescue ブロックの使用が義務化される前は、メソッドの内部にあるにもかかわらずメソッドの呼び出しを繰り返すという、もはや使用できない方法で使用される可能性がありました。

これで、'begin' ステートメントにジャンプするだけです。

しかし、私はこれについて確信が持てず、確認が必要です。もしそうなら、そのような使用を回復するための何らかの形はありますか?

ありがとう。

4

2 に答える 2