WEBVTT

00:00:00.000 --> 00:00:03.520 align:middle
こんにちは。このセッションでは
リターンについて学びます。

00:00:03.680 --> 00:00:07.440 align:middle
どうやって返り値を

00:00:07.600 --> 00:00:09.600 align:middle
ブロックやメソッドから返しますか？

00:00:10.480 --> 00:00:12.840 align:middle
そしてデフォルトの返り値は？

00:00:13.520 --> 00:00:15.840 align:middle
4つの場合について学びます。

00:00:16.000 --> 00:00:20.640 align:middle
キャレット（ ^ ）を使ったメソッドと

00:00:20.800 --> 00:00:23.080 align:middle
キャレットがないメソッドと

00:00:23.240 --> 00:00:25.720 align:middle
キャレットのあるブロックと

00:00:25.880 --> 00:00:28.000 align:middle
キャレットのないブロックです。

00:00:29.000 --> 00:00:31.040 align:middle
メソッドでは

00:00:31.200 --> 00:00:34.120 align:middle
キャレットで返り値を返す場合は

00:00:36.280 --> 00:00:39.120 align:middle
ここで

00:00:39.280 --> 00:00:42.160 align:middle
特定の値を返します。

00:00:43.240 --> 00:00:44.920 align:middle
そしてメソッドから出ます。

00:00:46.360 --> 00:00:48.640 align:middle
キャレットを使わない場合は

00:00:48.800 --> 00:00:51.680 align:middle
メソッドはデフォルトで self を返します。

00:00:53.560 --> 00:00:56.720 align:middle
この部分は省略していいです。
通常は書きません。

00:00:56.880 --> 00:01:01.640 align:middle
ブロックの返り値は最後の表現式です。

00:01:01.800 --> 00:01:03.720 align:middle
ブロックの場合

00:01:04.320 --> 00:01:06.120 align:middle
これらの間にあるブロックは

00:01:06.280 --> 00:01:08.960 align:middle
x を引数として取り

00:01:09.120 --> 00:01:11.200 align:middle
x に 33 を足し算します。

00:01:12.280 --> 00:01:16.560 align:middle
x + 33 の結果の値は

00:01:16.720 --> 00:01:19.120 align:middle
使われていません。なので消されます。

00:01:19.760 --> 00:01:23.640 align:middle
次の命令は x + 2 なので
x に 2 を足します。

00:01:24.960 --> 00:01:28.040 align:middle
ブロックの最後の表現式なので

00:01:28.200 --> 00:01:30.720 align:middle
その値が

00:01:30.880 --> 00:01:33.960 align:middle
ブロックの返り値になります。

00:01:34.920 --> 00:01:36.800 align:middle
なので、ブロックに value:5 は

00:01:36.960 --> 00:01:39.800 align:middle
ブロックを引数 x を 5 として

00:01:39.960 --> 00:01:42.360 align:middle
実行します。

00:01:42.520 --> 00:01:44.800 align:middle
したがって、 33 + 5 を計算します。

00:01:44.960 --> 00:01:47.840 align:middle
結果は消されます。
使われないので。

00:01:48.000 --> 00:01:50.840 align:middle
5 + 2 は 7 になります。

00:01:51.000 --> 00:01:53.480 align:middle
これはブロックの返り値として使われます。

00:01:53.640 --> 00:01:57.360 align:middle
したがって、全体の表現式の値は 7 です。

00:01:59.640 --> 00:02:02.440 align:middle
ブロックの中でキャレットを使うと

00:02:05.800 --> 00:02:09.400 align:middle
メソッドの場合とは
全く異なった振る舞いをします。

00:02:10.320 --> 00:02:14.320 align:middle
ブロックが終了することを
期待してはいけません。

00:02:15.120 --> 00:02:17.440 align:middle
メソッドが終了します。

00:02:17.600 --> 00:02:21.120 align:middle
例を見てみましょう。
Integer クラスの

00:02:21.280 --> 00:02:22.760 align:middle
factorial メソッドです。

00:02:24.200 --> 00:02:27.800 align:middle
ここにリターンがあり、ここにもあります。

00:02:27.960 --> 00:02:31.040 align:middle
これら 2 つのリターンは
メソッドの実行を終了させます。

00:02:32.680 --> 00:02:35.920 align:middle
つまりメソッドを実行する時に

00:02:36.080 --> 00:02:38.480 align:middle
レシーバーである self がゼロなら

00:02:38.640 --> 00:02:40.680 align:middle
このブロックが実行されます。

00:02:40.840 --> 00:02:44.160 align:middle
1 が直ちに返されて
メソッドが終了します。

00:02:44.320 --> 00:02:46.080 align:middle
つまりメソッドが 1 を返します。

00:02:47.000 --> 00:02:51.360 align:middle
リターンはブロックを終了するためではなく
それを含んでいるメソッドを終了させるために使われます。

00:02:52.680 --> 00:02:55.720 align:middle
2つ目の例では
self がゼロより大きい場合

00:02:56.600 --> 00:03:00.000 align:middle
再帰呼び出しをして

00:03:00.160 --> 00:03:02.400 align:middle
直ちに結果を返します。

00:03:02.560 --> 00:03:05.520 align:middle
つまりメソッドは
self がゼロより大きい場合には

00:03:05.680 --> 00:03:07.360 align:middle
実行を継続しません。

00:03:08.000 --> 00:03:11.480 align:middle
残る場合は
3行目にきたら

00:03:11.640 --> 00:03:15.760 align:middle
エラーになります。
レシーバーが負の数だということです。

00:03:16.440 --> 00:03:18.280 align:middle
覚えておくべきことは

00:03:18.440 --> 00:03:23.560 align:middle
キャレットはメソッドを停止させる
ということです。

00:03:23.720 --> 00:03:27.760 align:middle
キャレットがあるメソッドか、あるいは
ブロックを含んでいるメソッドをです。

00:03:27.920 --> 00:03:30.240 align:middle
キャレットは常にメソッドを停止させて

00:03:30.400 --> 00:03:33.200 align:middle
キャレットの後ろで指定された値を返します。

00:03:34.320 --> 00:03:37.280 align:middle
デフォルトでは
メソッドは self を返します。

00:03:38.040 --> 00:03:40.720 align:middle
メソッドの最後に
self を返すように書くのは無駄です。

00:03:40.880 --> 00:03:43.920 align:middle
デフォルトで返される値だからです。

00:03:45.760 --> 00:03:50.240 align:middle
ブロックは最後の表現式の結果を返します。

