﻿1
00:00:00,400 --> 00:00:01,640
こんにちは。

2
00:00:02,240 --> 00:00:06,560
今日は ifTrue:ifFalse: の
復習をします。

3
00:00:06,720 --> 00:00:09,920
今までちゃんと講義に参加していれば
（もちろん参加してきたと信じていますよ）

4
00:00:10,080 --> 00:00:14,320
not の例題をやった時に気付いたはずです。

5
00:00:14,480 --> 00:00:17,920
not と or と ifTrue:ifFalse:
を実装できると言いましたが

6
00:00:18,080 --> 00:00:21,320
正解として ifTrue:ifFalse: の実装を
示しませんでした。

7
00:00:21,480 --> 00:00:23,720
この問題を今やってみましょう。

8
00:00:24,440 --> 00:00:28,760
Pharo では条件分岐はメッセージです。

9
00:00:28,920 --> 00:00:30,480
ここに例があります。

10
00:00:30,640 --> 00:00:34,480
天気をあらわす Weather があります。
Weather isRaining

11
00:00:34,640 --> 00:00:36,600
とすると、雨降りであれば

12
00:00:37,240 --> 00:00:40,880
true となります。傘を持っていきます。

13
00:00:41,040 --> 00:00:43,400
false ならばサングラスを持っていきます。

14
00:00:43,760 --> 00:00:45,840
ifTrue:ifFalse: には

15
00:00:46,000 --> 00:00:50,960
コロンが 2 つありますね？
つまり、キーワードメッセージです。

16
00:00:51,120 --> 00:00:54,440
ifTrue:ifFalse: メッセージは
キーワードメッセージで

17
00:00:54,600 --> 00:00:57,320
真偽値のインスタンスに送られます。

18
00:00:58,160 --> 00:01:02,720
実際にはコンパイラによって最適化されて
本当に送られているわけではないですが

19
00:01:02,880 --> 00:01:05,640
概念的にいえば、メッセージを送ります。

20
00:01:05,800 --> 00:01:10,960
ifTrue:ifFalse: を

21
00:01:11,120 --> 00:01:12,640
再定義することは

22
00:01:12,800 --> 00:01:14,760
Pharo では可能です。

23
00:01:14,920 --> 00:01:17,240
これからその技術面を説明します。

24
00:01:17,400 --> 00:01:20,880
ifTrue:ifFalse: メソッドは
とても重要です。

25
00:01:21,040 --> 00:01:23,520
とても速く動作する必要があります。

26
00:01:23,680 --> 00:01:26,800
したがって関数を呼び出すのではなく

27
00:01:27,160 --> 00:01:29,400
コンパイラがジャンプ命令を
インライン展開します。

28
00:01:29,560 --> 00:01:33,240
この講義ではifTrue:ifFalse:が
どう機能するかを見るのが目的です。

29
00:01:33,400 --> 00:01:35,960
あなたの実装を提案してください。

30
00:01:36,120 --> 00:01:37,800
あなたはブロックを知っています。

31
00:01:37,960 --> 00:01:40,920
True や False で

32
00:01:41,120 --> 00:01:42,720
or や not をどう扱うのかを
知っています。

33
00:01:42,880 --> 00:01:45,440
同じことを ifTrue:ifFalse:
にも適用します。

34
00:01:45,600 --> 00:01:49,960
この場合、もしレシーバーが false ならば
5 を返します。

35
00:01:50,120 --> 00:01:52,880
レシーバーが true ならば
3 を返します。

36
00:01:53,600 --> 00:01:56,920
繰り返しますが、オブジェクトと
メッセージとブロックがあります。

37
00:01:57,080 --> 00:02:00,000
くどいと思いますが
そういうものです。

38
00:02:00,600 --> 00:02:03,480
角括弧は表現式の実行を凍結して

39
00:02:05,960 --> 00:02:08,080
value メッセージを受け取ると

40
00:02:08,240 --> 00:02:10,800
凍結されたコードの実行を開始する

41
00:02:10,960 --> 00:02:15,360
ということを覚えていますね。

42
00:02:15,520 --> 00:02:18,680
これを使って
さらに、not や or で

43
00:02:18,840 --> 00:02:21,480
条件式を実装したように

44
00:02:21,640 --> 00:02:25,280
ifTrue:ifFalse: を実装できるはずです。

45
00:02:25,440 --> 00:02:27,960
数秒あげるので考えてみてください。

46
00:02:29,000 --> 00:02:30,720
どうやって実装するかというと

47
00:02:30,880 --> 00:02:34,360
or や not と同じ方法です。

48
00:02:34,520 --> 00:02:37,280
True クラスに
ifTrue:ifFalse:メソッドを定義して

49
00:02:37,440 --> 00:02:39,920
引数を 2 つ取ります。

50
00:02:40,080 --> 00:02:44,280
1 つは true の場合のブロックで
もう 1 つは false の場合のブロックです。

51
00:02:44,440 --> 00:02:45,520
これを使って

52
00:02:45,680 --> 00:02:48,320
自分が True クラス に属していれば
aTrueBlock を実行します。

53
00:02:49,600 --> 00:02:52,160
自分が False クラスに属していれば

54
00:02:52,320 --> 00:02:56,240
同じ引数の同じメソッドであっても

55
00:02:56,400 --> 00:03:00,160
False クラスでは
aFalseBlockを実行します。

56
00:03:00,520 --> 00:03:03,080
Boolean での実装では

57
00:03:03,240 --> 00:03:04,440
どうなっているかというと

58
00:03:05,400 --> 00:03:06,520
こうなっています。

59
00:03:06,680 --> 00:03:10,160
真偽値にメッセージを送ります。

60
00:03:10,320 --> 00:03:12,560
ここで、その真偽値は true だとします。

61
00:03:12,720 --> 00:03:16,480
ifTrue: [doTrue] ifFalse: [doFalse]
を送ります。

62
00:03:16,640 --> 00:03:20,520
すると ifTrue:ifFalse: を
True クラスで探索します。

63
00:03:20,680 --> 00:03:21,920
ここにあります。

64
00:03:22,080 --> 00:03:25,440
aTBlock を実行しろとあるので
実行します。

65
00:03:25,600 --> 00:03:29,600
同じメッセージを false に送ると

66
00:03:29,760 --> 00:03:33,800
メソッドを探索して
この ifTrue:ifFalse: が見つかります。

67
00:03:33,960 --> 00:03:38,760
aFBlock を実行しろとあるので
実行します。

68
00:03:39,200 --> 00:03:43,480
この実装をブレークポイントを置いて
テストすることはできません。

69
00:03:43,640 --> 00:03:46,400
最適化されているので
システムがそれを受け付けません。

70
00:03:46,560 --> 00:03:50,840
代わりに、同じ方法で

71
00:03:51,000 --> 00:03:52,800
別のメソッド名で

72
00:03:52,960 --> 00:03:55,080
実装してみてください。

73
00:03:56,160 --> 00:04:00,680
ブレークポイントを使って

74
00:04:00,840 --> 00:04:03,280
実験してみてください。

75
00:04:03,880 --> 00:04:07,920
この例でお見せしたのは

76
00:04:08,080 --> 00:04:11,640
メッセージを送って
正しいメソッドを選択することを使って

77
00:04:11,800 --> 00:04:16,320
メッセージレシーバーに
その振る舞いを決定させるということです。

78
00:04:16,480 --> 00:04:21,400
また、角括弧で計算を凍結して

79
00:04:21,560 --> 00:04:24,840
value が凍結されたコードの実行を
開始させます。
