こんにちは。このセッションでは リターンについて学びます。
どうやって返り値を
ブロックやメソッドから返しますか？
そしてデフォルトの返り値は？
4つの場合について学びます。
キャレット（ ^ ）を使ったメソッドと
キャレットがないメソッドと
キャレットのあるブロックと
キャレットのないブロックです。
メソッドでは
キャレットで返り値を返す場合は
ここで
特定の値を返します。
そしてメソッドから出ます。
キャレットを使わない場合は
メソッドはデフォルトで self を返します。
この部分は省略していいです。 通常は書きません。
ブロックの返り値は最後の表現式です。
ブロックの場合
これらの間にあるブロックは
x を引数として取り
x に 33 を足し算します。
x + 33 の結果の値は
使われていません。なので消されます。
次の命令は x + 2 なので x に 2 を足します。
ブロックの最後の表現式なので
その値が
ブロックの返り値になります。
なので、ブロックに value:5 は
ブロックを引数 x を 5 として
実行します。
したがって、 33 + 5 を計算します。
結果は消されます。 使われないので。
5 + 2 は 7 になります。
これはブロックの返り値として使われます。
したがって、全体の表現式の値は 7 です。
ブロックの中でキャレットを使うと
メソッドの場合とは 全く異なった振る舞いをします。
ブロックが終了することを 期待してはいけません。
メソッドが終了します。
例を見てみましょう。 Integer クラスの
factorial メソッドです。
ここにリターンがあり、ここにもあります。
これら 2 つのリターンは メソッドの実行を終了させます。
つまりメソッドを実行する時に
レシーバーである self がゼロなら
このブロックが実行されます。
1 が直ちに返されて メソッドが終了します。
つまりメソッドが 1 を返します。
リターンはブロックを終了するためではなく それを含んでいるメソッドを終了させるために使われます。
2つ目の例では self がゼロより大きい場合
再帰呼び出しをして
直ちに結果を返します。
つまりメソッドは self がゼロより大きい場合には
実行を継続しません。
残る場合は 3行目にきたら
エラーになります。 レシーバーが負の数だということです。
覚えておくべきことは
キャレットはメソッドを停止させる ということです。
キャレットがあるメソッドか、あるいは ブロックを含んでいるメソッドをです。
キャレットは常にメソッドを停止させて
キャレットの後ろで指定された値を返します。
デフォルトでは メソッドは self を返します。
メソッドの最後に self を返すように書くのは無駄です。
デフォルトで返される値だからです。
ブロックは最後の表現式の結果を返します。