アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつも、ご教授ありがとうございます。
Ruby でメソッドを自作してそのメソッドにブロックを持たせる場合
ブロック内で返り値を返すためにはどうしたらいいのでしょうか?

たとえば以下のような自作メソッドがあるとすると
def blocktest(str)

if (block_given?)

yield str

else
print "メソッドにブロックが与えられていない";
end
end

begin

#自作したメソッドにブロックを与えた場合
res = blocktest("ブロック付きメソッドのテスト") {|value|
print value;
print "<br/>"
print "メソッドに与えられた引数をprintしています"
return "ブロックで返り値"
}

print res;

print "<hr />"

#ブロックを与えない場合
blocktest("ブロック付きメソッドのテスト");

rescue => ex
print ex.message
end

上記のようにブロック内で返り値 を指定して変数resのその返り値を返したい場合
どうしたらいいのでしょうか?
一応、ブロック内でreturnで値を与えてはいますが、例外が発生します。
よろしくお願いしまう。

A 回答 (1件)

そういうときは、return でなく、break を使います。



return はメソッドからの戻りなので、たとえば、

def foo
 (1..10).each do |i|
  return 1 if i==3
 end
0
end

のreturnは、eachからの抜け出しでなく、fooの終了になります。
お書きのプログラムだと、メソッドの中じゃないのにreturnしてるので、エラーですね。
ブロックからの抜け出しはbreakです。


中級以上の話になると、lambdaとprocというオブジェクトがあって、lambdaのブロックの中ではreturnが使えるなど、ちょっとややこしい話になりますが、初級のうちは気にしなくていいでしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます!
なんとか返り値を取得できました。

お礼日時:2011/09/19 17:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!