1 00:00:00,560 --> 00:00:04,240 このコースでは Pharo での真偽値と条件分岐について学びます。 2 00:00:04,960 --> 00:00:09,160 真偽値を表すオブジェクトが2つあります。 true と false です。 3 00:00:09,320 --> 00:00:12,480 true は True クラスの唯一のインスタンスです。 4 00:00:12,640 --> 00:00:15,440 false は False クラスの唯一のインスタンスです。 5 00:00:15,600 --> 00:00:20,640 論理演算をするためには これらのオブジェクトにメッセージを送ります。 6 00:00:20,800 --> 00:00:24,160 あるいは ifTrue:ifFalse: 等のような 分岐構造をつくります。 7 00:00:24,320 --> 00:00:26,280 これを学びましょう。 8 00:00:26,920 --> 00:00:29,880 このスライドの最初の例では 9 00:00:30,040 --> 00:00:34,240 二項演算子として & メッセージを 10 00:00:34,400 --> 00:00:35,720 false オブジェクトに送っています。 11 00:00:35,880 --> 00:00:38,520 引数として これ全てを渡します。 12 00:00:38,680 --> 00:00:42,320 括弧で囲まれた表現式です。 (1 error:'crazy') 13 00:00:42,480 --> 00:00:45,480 この式はエラーを発生させます。 14 00:00:45,640 --> 00:00:50,280 この式全体がエラーを起こすことがわかります。 15 00:00:50,440 --> 00:00:53,600 なぜかというと オペランドが評価されたからです。 16 00:00:53,760 --> 00:00:56,280 この論理式の中で。 17 00:00:57,560 --> 00:01:01,000 オペランドが評価されたから 失敗するのです。 18 00:01:01,160 --> 00:01:05,640 論理式の遅延評価が必要であれば 19 00:01:05,800 --> 00:01:10,960 Booleanクラスのメソッドである and: を使わなければなりません。 20 00:01:11,120 --> 00:01:13,440 このメソッドはブロックを引数として取ります。 21 00:01:13,600 --> 00:01:18,000 ブロックは [ で始まって ] で終わります。 22 00:01:18,160 --> 00:01:21,320 ブロックは表現式を持ちますが ブロック式を定義しただけでは 23 00:01:21,480 --> 00:01:24,800 その表現式は実行されません。 24 00:01:24,960 --> 00:01:28,640 今のところは これらの表現式は評価されません。 25 00:01:28,800 --> 00:01:31,600 第一オペランドが true か false か 評価された時にのみ 26 00:01:32,320 --> 00:01:35,600 引数として渡されたブロックが評価されます。 27 00:01:35,760 --> 00:01:39,880 2番目の例では false and: ブロック となっています。 28 00:01:40,040 --> 00:01:45,440 引数として渡されたブロックを評価することなしに false を返します。 29 00:01:45,960 --> 00:01:49,360 典型的な遅延演算子ですが ブロックを使って作られています。 30 00:01:51,400 --> 00:01:55,160 Pharo では if、false、while等といった 条件分岐は 31 00:01:55,320 --> 00:01:59,160 真偽値やブロックに送られるメッセージです。 32 00:02:00,080 --> 00:02:01,800 別の例を見てみましょう。 33 00:02:01,960 --> 00:02:06,960 ifTrue:ifFalse: メッセージです。 あらゆるプログラミング言語に典型的なものです。 34 00:02:07,120 --> 00:02:09,280 しかし Pharo では これは実際にはメッセージなのです。 35 00:02:09,440 --> 00:02:13,440 真偽値オブジェクトに ifTrue:ifFalse: メッセージを送ります。 36 00:02:13,600 --> 00:02:16,480 この式は真偽値を返します。 37 00:02:17,840 --> 00:02:22,760 メッセージの引数として2つのブロックを渡します。 38 00:02:22,920 --> 00:02:26,560 1つのブロックは レシーバーの真偽値が true の場合に評価されます。 39 00:02:26,720 --> 00:02:29,480 もう1つのブロックは レシーバーが false の場合に評価されます。 40 00:02:30,560 --> 00:02:33,200 注意してください。 ifTrue:ifFalse: メッセージは 41 00:02:33,360 --> 00:02:37,000 Pharo ではとてもよく使われています。 システムの心臓部なのです。 42 00:02:37,160 --> 00:02:42,320 とても重要なので システム全体が遅くならないよう 43 00:02:42,480 --> 00:02:46,480 実行効率のために高度に最適化されています。 44 00:02:47,800 --> 00:02:51,160 Pharo での真偽値の実装の話に戻りましょう。 45 00:02:51,320 --> 00:02:53,360 極めてエレガントです。 46 00:02:53,520 --> 00:02:59,000 true および false というオブジェクトは それぞれ True クラスと False クラスのインスタンスで 47 00:02:59,160 --> 00:03:01,400 いずれのクラスも Boolean クラスを継承しています。 48 00:03:01,560 --> 00:03:04,760 これらのクラスはそれぞれ 期待された振る舞いをするように 49 00:03:04,920 --> 00:03:07,640 一揃いのメソッドが実装されています。 50 00:03:07,800 --> 00:03:13,080 このエレガントな実装については 別のレッスンで 51 00:03:13,240 --> 00:03:15,200 掘り下げてみましょう。 52 00:03:16,640 --> 00:03:19,560 ifTrue:ifFalse: メッセージの話に戻ります。 53 00:03:19,720 --> 00:03:23,200 このメッセージには色々なバージョンがあります。 54 00:03:23,360 --> 00:03:28,040 1つのブロックを引数にとる ifTrue: のみからなる バージョンもあり 55 00:03:28,960 --> 00:03:31,760 分岐の最初の部分だけを返します。 56 00:03:31,920 --> 00:03:34,960 ifTrue:ifFalse:メッセージは 2つのブロックを取り 57 00:03:35,120 --> 00:03:39,480 真偽値が true か false かによって 分岐のいずれかを返します。 58 00:03:40,520 --> 00:03:43,720 ここにいくつかの例があります。 59 00:03:43,880 --> 00:03:46,480 これは ifTrue: メッセージを送り 60 00:03:46,640 --> 00:03:49,960 ブロックを1つだけ渡して 表現式が true の場合のみ実行されます。 61 00:03:50,120 --> 00:03:53,080 この例では 評価されるブロックは1つです。 62 00:03:53,240 --> 00:03:55,920 もしレシーバーの真偽値が true ならば こちらのブロックが 63 00:03:56,080 --> 00:03:58,320 もし false ならば こちらのブロックが実行されます。 64 00:04:00,960 --> 00:04:02,960 これらはそれぞれ別々のメッセージです。 65 00:04:03,120 --> 00:04:05,120 ifFalse: も同様で 66 00:04:05,280 --> 00:04:08,760 Boolean、True、Falseといったクラス で扱われます。 67 00:04:10,400 --> 00:04:15,560 条件分岐を表現するための 他の種類のメッセージも用意されています。 68 00:04:15,720 --> 00:04:18,360 例えば、 ifEmpty:ifNotEmpty: という 69 00:04:18,520 --> 00:04:20,600 コレクションに送るメッセージです。 70 00:04:20,760 --> 00:04:23,920 ifEmpty: にブロックを渡します。 71 00:04:24,920 --> 00:04:29,200 レシーバーのコレクションが空の場合にのみ ブロックが実行されます。 72 00:04:29,960 --> 00:04:34,480 ifNotEmpty: はそれとは逆の条件です。 73 00:04:34,640 --> 00:04:38,240 もしコレクションが空でなければ ブロックが実行されます。 74 00:04:38,400 --> 00:04:40,920 もう1点。 75 00:04:41,080 --> 00:04:45,080 このブロックは引数を1つ取ります。 76 00:04:45,240 --> 00:04:47,680 渡されるのは空ではないコレクションです。 77 00:04:47,840 --> 00:04:51,880 このコレクションは 何か複雑な計算をした結果かもしれません。 78 00:04:52,040 --> 00:04:54,520 そのコレクションを得るために もう一度そのクエリーを実行することもできます。 79 00:04:54,680 --> 00:04:58,600 もしコレクションが空ではない場合 ブロックに引数として渡されます。 80 00:04:58,760 --> 00:05:01,320 そして渡されたコレクションを ブロックの表現式の中で使うことができます。 81 00:05:02,160 --> 00:05:03,920 このセッションでは 82 00:05:04,080 --> 00:05:06,800 Pharo では真偽値は通常のオブジェクトであり 83 00:05:06,960 --> 00:05:10,800 Booleanクラスを継承するTrueクラスとFalseクラスの インスタンスであることを学びました。 84 00:05:10,960 --> 00:05:12,560 それらの真偽値にメッセージを送ることができます。 85 00:05:12,720 --> 00:05:18,240 それらのメッセージは Pharo での条件分岐や条件式を 86 00:05:18,400 --> 00:05:21,520 構成するために定義されています。 87 00:05:21,680 --> 00:05:26,440 他の言語ではそういった構造はコンパイラに依っています。