1 00:00:00,000 --> 00:00:03,520 こんにちは。このセッションでは リターンについて学びます。 2 00:00:03,680 --> 00:00:07,440 どうやって返り値を 3 00:00:07,600 --> 00:00:09,600 ブロックやメソッドから返しますか? 4 00:00:10,480 --> 00:00:12,840 そしてデフォルトの返り値は? 5 00:00:13,520 --> 00:00:15,840 4つの場合について学びます。 6 00:00:16,000 --> 00:00:20,640 キャレット( ^ )を使ったメソッドと 7 00:00:20,800 --> 00:00:23,080 キャレットがないメソッドと 8 00:00:23,240 --> 00:00:25,720 キャレットのあるブロックと 9 00:00:25,880 --> 00:00:28,000 キャレットのないブロックです。 10 00:00:29,000 --> 00:00:31,040 メソッドでは 11 00:00:31,200 --> 00:00:34,120 キャレットで返り値を返す場合は 12 00:00:36,280 --> 00:00:39,120 ここで 13 00:00:39,280 --> 00:00:42,160 特定の値を返します。 14 00:00:43,240 --> 00:00:44,920 そしてメソッドから出ます。 15 00:00:46,360 --> 00:00:48,640 キャレットを使わない場合は 16 00:00:48,800 --> 00:00:51,680 メソッドはデフォルトで self を返します。 17 00:00:53,560 --> 00:00:56,720 この部分は省略していいです。 通常は書きません。 18 00:00:56,880 --> 00:01:01,640 ブロックの返り値は最後の表現式です。 19 00:01:01,800 --> 00:01:03,720 ブロックの場合 20 00:01:04,320 --> 00:01:06,120 これらの間にあるブロックは 21 00:01:06,280 --> 00:01:08,960 x を引数として取り 22 00:01:09,120 --> 00:01:11,200 x に 33 を足し算します。 23 00:01:12,280 --> 00:01:16,560 x + 33 の結果の値は 24 00:01:16,720 --> 00:01:19,120 使われていません。なので消されます。 25 00:01:19,760 --> 00:01:23,640 次の命令は x + 2 なので x に 2 を足します。 26 00:01:24,960 --> 00:01:28,040 ブロックの最後の表現式なので 27 00:01:28,200 --> 00:01:30,720 その値が 28 00:01:30,880 --> 00:01:33,960 ブロックの返り値になります。 29 00:01:34,920 --> 00:01:36,800 なので、ブロックに value:5 は 30 00:01:36,960 --> 00:01:39,800 ブロックを引数 x を 5 として 31 00:01:39,960 --> 00:01:42,360 実行します。 32 00:01:42,520 --> 00:01:44,800 したがって、 33 + 5 を計算します。 33 00:01:44,960 --> 00:01:47,840 結果は消されます。 使われないので。 34 00:01:48,000 --> 00:01:50,840 5 + 2 は 7 になります。 35 00:01:51,000 --> 00:01:53,480 これはブロックの返り値として使われます。 36 00:01:53,640 --> 00:01:57,360 したがって、全体の表現式の値は 7 です。 37 00:01:59,640 --> 00:02:02,440 ブロックの中でキャレットを使うと 38 00:02:05,800 --> 00:02:09,400 メソッドの場合とは 全く異なった振る舞いをします。 39 00:02:10,320 --> 00:02:14,320 ブロックが終了することを 期待してはいけません。 40 00:02:15,120 --> 00:02:17,440 メソッドが終了します。 41 00:02:17,600 --> 00:02:21,120 例を見てみましょう。 Integer クラスの 42 00:02:21,280 --> 00:02:22,760 factorial メソッドです。 43 00:02:24,200 --> 00:02:27,800 ここにリターンがあり、ここにもあります。 44 00:02:27,960 --> 00:02:31,040 これら 2 つのリターンは メソッドの実行を終了させます。 45 00:02:32,680 --> 00:02:35,920 つまりメソッドを実行する時に 46 00:02:36,080 --> 00:02:38,480 レシーバーである self がゼロなら 47 00:02:38,640 --> 00:02:40,680 このブロックが実行されます。 48 00:02:40,840 --> 00:02:44,160 1 が直ちに返されて メソッドが終了します。 49 00:02:44,320 --> 00:02:46,080 つまりメソッドが 1 を返します。 50 00:02:47,000 --> 00:02:51,360 リターンはブロックを終了するためではなく それを含んでいるメソッドを終了させるために使われます。 51 00:02:52,680 --> 00:02:55,720 2つ目の例では self がゼロより大きい場合 52 00:02:56,600 --> 00:03:00,000 再帰呼び出しをして 53 00:03:00,160 --> 00:03:02,400 直ちに結果を返します。 54 00:03:02,560 --> 00:03:05,520 つまりメソッドは self がゼロより大きい場合には 55 00:03:05,680 --> 00:03:07,360 実行を継続しません。 56 00:03:08,000 --> 00:03:11,480 残る場合は 3行目にきたら 57 00:03:11,640 --> 00:03:15,760 エラーになります。 レシーバーが負の数だということです。 58 00:03:16,440 --> 00:03:18,280 覚えておくべきことは 59 00:03:18,440 --> 00:03:23,560 キャレットはメソッドを停止させる ということです。 60 00:03:23,720 --> 00:03:27,760 キャレットがあるメソッドか、あるいは ブロックを含んでいるメソッドをです。 61 00:03:27,920 --> 00:03:30,240 キャレットは常にメソッドを停止させて 62 00:03:30,400 --> 00:03:33,200 キャレットの後ろで指定された値を返します。 63 00:03:34,320 --> 00:03:37,280 デフォルトでは メソッドは self を返します。 64 00:03:38,040 --> 00:03:40,720 メソッドの最後に self を返すように書くのは無駄です。 65 00:03:40,880 --> 00:03:43,920 デフォルトで返される値だからです。 66 00:03:45,760 --> 00:03:50,240 ブロックは最後の表現式の結果を返します。