﻿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
ブロックは最後の表現式の結果を返します。
