7

私が考えることができる唯一のユースケースはredo、ソケットへの書き込みやデータベースからの読み取りなどの操作ですが、これらが1回失敗すると、その後の試行も失敗する可能性が高いため、私にとっては少し無意味に思えますretry。それが役立つと思われるケースは本当に考えられません。

私はRubyを知らないか使用していないので、これは意味がないように思えるかもしれませんが、いつか素晴らしい言語を作成したいと思っているので、少なくとも、そこにある最も人気のある言語の設計の背後にある理由を知りたいと思います。

4

2 に答える 2

9

アイデアは、あなたが何をしていたかが二度目に機能することを期待して、redoまたはを呼び出す前に何かを変更することです。retryの例はありませんが、作業中のアプリケーションでのredo使用法が見つかりました。retry基本的に、外部(ネットワークなど)が原因で失敗する可能性のあるコードが少しあるが、コードを実行するたびに前提条件チェックを実行するとコストがかかりすぎる場合retryは、begin...rescueブロックで使用できます。それが明確かどうかわからないので、例を正しく説明します。

基本的に、を使用してリモートディレクトリにアクセスするコードがいくつかありますNet:SFTP。ディレクトリは存在するはずですが、一部の例外的なケースでは、まだ作成されていません。そこにない場合は、一度試してみてください。ただし、ネットワークアクセスを実行してディレクトリが毎回存在するかどうかを確認するのは、特に例外的な場合にのみディレクトリが存在しないため、コストがかかりすぎます。したがって、次のようにします。

tried_mkdir = false
begin
  # Attempt to access remote directory
  ...
rescue Net::SFTP::StatusException
  raise if tried_mkdir
  tried_mkdir = true
  # Attempt to make the remote directory
  ...
  retry
end
于 2012-04-08T16:31:09.877 に答える
7

のユースケースredoは、ユーザー入力チェックである可能性があります。

nums = Array.new(5){[rand(1..9), rand(1..9)]}
nums.each do |num1, num2|
  print "What is #{num1} + #{num2}: "
  redo unless gets.to_i == num1 + num2
end
于 2012-04-08T19:52:25.107 に答える