こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【ruby】【文法?】ブロックをbreakした時。。

質問を見ていただいて有難うございます。

質問を一言で言うと、
「メソッドの中で呼び出し元がbreakを使った事を検知できるか?」
となるのでしょうか。。。以下に詳しく質問を記述いたします。

引数に配列を渡すと、その配列をブロックに一つずつ返してくれる
メソッドhoge()があるとします。
以下の様に使います。
-------------------------------------
hoge([0,1,2]) do |x|
 puts x
end

実行結果
0
1
2
-------------------------------------

このhoge()は、実行中にエラーが発生した場合、トラップして
falseを返す事とします。(何事もなければtrueを返します。)

このhoge()を以下の様に書きました。
def hoge(arg)
 begin
  arg.each do |x|
   yield x
  end
 rescue
  false
 else
  true
 end
end

以下の様に使います。
-------------------------------------
ret=hoge([0,1,2]) do |x|
 puts x
end
puts ret ? 'success' : 'fail'

実行結果
0
1
2
success
-------------------------------------

-------------------------------------
ret=hoge(nil) do |x|
 puts x
end
puts ret ? 'success' : 'fail'

実行結果
fail
-------------------------------------
ここまでは、よかったのですが、hoge()のブロックの中で、breakを使うと
hoge()の戻り値はnilになってしまいます。
-------------------------------------
ret=hoge([0,1,2]) do |x|
 break if x==1
 puts x
end
puts ret
puts ret ? 'success' : 'fail'

実行結果
0
nil
fail
-------------------------------------

ここで質問です。
最後の例は、hoge()として異常系ではないので、retにtrueを与えたいのですが、どうしたらよいでしょうか?

ご指導のほど、宜しくお願いいたします。

投稿日時 - 2009-09-20 23:47:09

QNo.5306239

暇なときに回答ください

質問者が選んだベストアンサー

hoge で対処するのは多分できないと思います。
hoge を使うところを修正してよいのなら

ret=hoge([0,1,2]) do |x|
 break true if x==1
 puts x
end

と break に戻り値を与えれば success にはなると思います。
が、使い勝手はいまいちですねえ。

投稿日時 - 2009-09-21 03:15:16

お礼

sakusaker7さん ご回答有難うございます。

breakに戻り値を付けられるとは知りませんでした。

投稿日時 - 2009-09-21 04:27:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問