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 が凍結されたコードの実行を 開始させます。