WEBVTT

00:00:00.400 --> 00:00:01.640 align:middle
こんにちは。

00:00:02.240 --> 00:00:06.560 align:middle
今日は ifTrue:ifFalse: の
復習をします。

00:00:06.720 --> 00:00:09.920 align:middle
今までちゃんと講義に参加していれば
（もちろん参加してきたと信じていますよ）

00:00:10.080 --> 00:00:14.320 align:middle
not の例題をやった時に気付いたはずです。

00:00:14.480 --> 00:00:17.920 align:middle
not と or と ifTrue:ifFalse:
を実装できると言いましたが

00:00:18.080 --> 00:00:21.320 align:middle
正解として ifTrue:ifFalse: の実装を
示しませんでした。

00:00:21.480 --> 00:00:23.720 align:middle
この問題を今やってみましょう。

00:00:24.440 --> 00:00:28.760 align:middle
Pharo では条件分岐はメッセージです。

00:00:28.920 --> 00:00:30.480 align:middle
ここに例があります。

00:00:30.640 --> 00:00:34.480 align:middle
天気をあらわす Weather があります。
Weather isRaining

00:00:34.640 --> 00:00:36.600 align:middle
とすると、雨降りであれば

00:00:37.240 --> 00:00:40.880 align:middle
true となります。傘を持っていきます。

00:00:41.040 --> 00:00:43.400 align:middle
false ならばサングラスを持っていきます。

00:00:43.760 --> 00:00:45.840 align:middle
ifTrue:ifFalse: には

00:00:46.000 --> 00:00:50.960 align:middle
コロンが 2 つありますね？
つまり、キーワードメッセージです。

00:00:51.120 --> 00:00:54.440 align:middle
ifTrue:ifFalse: メッセージは
キーワードメッセージで

00:00:54.600 --> 00:00:57.320 align:middle
真偽値のインスタンスに送られます。

00:00:58.160 --> 00:01:02.720 align:middle
実際にはコンパイラによって最適化されて
本当に送られているわけではないですが

00:01:02.880 --> 00:01:05.640 align:middle
概念的にいえば、メッセージを送ります。

00:01:05.800 --> 00:01:10.960 align:middle
ifTrue:ifFalse: を

00:01:11.120 --> 00:01:12.640 align:middle
再定義することは

00:01:12.800 --> 00:01:14.760 align:middle
Pharo では可能です。

00:01:14.920 --> 00:01:17.240 align:middle
これからその技術面を説明します。

00:01:17.400 --> 00:01:20.880 align:middle
ifTrue:ifFalse: メソッドは
とても重要です。

00:01:21.040 --> 00:01:23.520 align:middle
とても速く動作する必要があります。

00:01:23.680 --> 00:01:26.800 align:middle
したがって関数を呼び出すのではなく

00:01:27.160 --> 00:01:29.400 align:middle
コンパイラがジャンプ命令を
インライン展開します。

00:01:29.560 --> 00:01:33.240 align:middle
この講義ではifTrue:ifFalse:が
どう機能するかを見るのが目的です。

00:01:33.400 --> 00:01:35.960 align:middle
あなたの実装を提案してください。

00:01:36.120 --> 00:01:37.800 align:middle
あなたはブロックを知っています。

00:01:37.960 --> 00:01:40.920 align:middle
True や False で

00:01:41.120 --> 00:01:42.720 align:middle
or や not をどう扱うのかを
知っています。

00:01:42.880 --> 00:01:45.440 align:middle
同じことを ifTrue:ifFalse:
にも適用します。

00:01:45.600 --> 00:01:49.960 align:middle
この場合、もしレシーバーが false ならば
5 を返します。

00:01:50.120 --> 00:01:52.880 align:middle
レシーバーが true ならば
3 を返します。

00:01:53.600 --> 00:01:56.920 align:middle
繰り返しますが、オブジェクトと
メッセージとブロックがあります。

00:01:57.080 --> 00:02:00.000 align:middle
くどいと思いますが
そういうものです。

00:02:00.600 --> 00:02:03.480 align:middle
角括弧は表現式の実行を凍結して

00:02:05.960 --> 00:02:08.080 align:middle
value メッセージを受け取ると

00:02:08.240 --> 00:02:10.800 align:middle
凍結されたコードの実行を開始する

00:02:10.960 --> 00:02:15.360 align:middle
ということを覚えていますね。

00:02:15.520 --> 00:02:18.680 align:middle
これを使って
さらに、not や or で

00:02:18.840 --> 00:02:21.480 align:middle
条件式を実装したように

00:02:21.640 --> 00:02:25.280 align:middle
ifTrue:ifFalse: を実装できるはずです。

00:02:25.440 --> 00:02:27.960 align:middle
数秒あげるので考えてみてください。

00:02:29.000 --> 00:02:30.720 align:middle
どうやって実装するかというと

00:02:30.880 --> 00:02:34.360 align:middle
or や not と同じ方法です。

00:02:34.520 --> 00:02:37.280 align:middle
True クラスに
ifTrue:ifFalse:メソッドを定義して

00:02:37.440 --> 00:02:39.920 align:middle
引数を 2 つ取ります。

00:02:40.080 --> 00:02:44.280 align:middle
1 つは true の場合のブロックで
もう 1 つは false の場合のブロックです。

00:02:44.440 --> 00:02:45.520 align:middle
これを使って

00:02:45.680 --> 00:02:48.320 align:middle
自分が True クラス に属していれば
aTrueBlock を実行します。

00:02:49.600 --> 00:02:52.160 align:middle
自分が False クラスに属していれば

00:02:52.320 --> 00:02:56.240 align:middle
同じ引数の同じメソッドであっても

00:02:56.400 --> 00:03:00.160 align:middle
False クラスでは
aFalseBlockを実行します。

00:03:00.520 --> 00:03:03.080 align:middle
Boolean での実装では

00:03:03.240 --> 00:03:04.440 align:middle
どうなっているかというと

00:03:05.400 --> 00:03:06.520 align:middle
こうなっています。

00:03:06.680 --> 00:03:10.160 align:middle
真偽値にメッセージを送ります。

00:03:10.320 --> 00:03:12.560 align:middle
ここで、その真偽値は true だとします。

00:03:12.720 --> 00:03:16.480 align:middle
ifTrue: [doTrue] ifFalse: [doFalse]
を送ります。

00:03:16.640 --> 00:03:20.520 align:middle
すると ifTrue:ifFalse: を
True クラスで探索します。

00:03:20.680 --> 00:03:21.920 align:middle
ここにあります。

00:03:22.080 --> 00:03:25.440 align:middle
aTBlock を実行しろとあるので
実行します。

00:03:25.600 --> 00:03:29.600 align:middle
同じメッセージを false に送ると

00:03:29.760 --> 00:03:33.800 align:middle
メソッドを探索して
この ifTrue:ifFalse: が見つかります。

00:03:33.960 --> 00:03:38.760 align:middle
aFBlock を実行しろとあるので
実行します。

00:03:39.200 --> 00:03:43.480 align:middle
この実装をブレークポイントを置いて
テストすることはできません。

00:03:43.640 --> 00:03:46.400 align:middle
最適化されているので
システムがそれを受け付けません。

00:03:46.560 --> 00:03:50.840 align:middle
代わりに、同じ方法で

00:03:51.000 --> 00:03:52.800 align:middle
別のメソッド名で

00:03:52.960 --> 00:03:55.080 align:middle
実装してみてください。

00:03:56.160 --> 00:04:00.680 align:middle
ブレークポイントを使って

00:04:00.840 --> 00:04:03.280 align:middle
実験してみてください。

00:04:03.880 --> 00:04:07.920 align:middle
この例でお見せしたのは

00:04:08.080 --> 00:04:11.640 align:middle
メッセージを送って
正しいメソッドを選択することを使って

00:04:11.800 --> 00:04:16.320 align:middle
メッセージレシーバーに
その振る舞いを決定させるということです。

00:04:16.480 --> 00:04:21.400 align:middle
また、角括弧で計算を凍結して

00:04:21.560 --> 00:04:24.840 align:middle
value が凍結されたコードの実行を
開始させます。

