このコースでは Pharo での真偽値と条件分岐について学びます。
真偽値を表すオブジェクトが2つあります。 true と false です。
true は True クラスの唯一のインスタンスです。
false は False クラスの唯一のインスタンスです。
論理演算をするためには これらのオブジェクトにメッセージを送ります。
あるいは ifTrue:ifFalse: 等のような 分岐構造をつくります。
これを学びましょう。
このスライドの最初の例では
二項演算子として & メッセージを
false オブジェクトに送っています。
引数として これ全てを渡します。
括弧で囲まれた表現式です。 (1 error:'crazy')
この式はエラーを発生させます。
この式全体がエラーを起こすことがわかります。
なぜかというと オペランドが評価されたからです。
この論理式の中で。
オペランドが評価されたから 失敗するのです。
論理式の遅延評価が必要であれば
Booleanクラスのメソッドである and: を使わなければなりません。
このメソッドはブロックを引数として取ります。
ブロックは [ で始まって ] で終わります。
ブロックは表現式を持ちますが ブロック式を定義しただけでは
その表現式は実行されません。
今のところは これらの表現式は評価されません。
第一オペランドが true か false か 評価された時にのみ
引数として渡されたブロックが評価されます。
2番目の例では false and: ブロック となっています。
引数として渡されたブロックを評価することなしに false を返します。
典型的な遅延演算子ですが ブロックを使って作られています。
Pharo では if、false、while等といった 条件分岐は
真偽値やブロックに送られるメッセージです。
別の例を見てみましょう。
ifTrue:ifFalse: メッセージです。 あらゆるプログラミング言語に典型的なものです。
しかし Pharo では これは実際にはメッセージなのです。
真偽値オブジェクトに ifTrue:ifFalse: メッセージを送ります。
この式は真偽値を返します。
メッセージの引数として2つのブロックを渡します。
1つのブロックは レシーバーの真偽値が true の場合に評価されます。
もう1つのブロックは レシーバーが false の場合に評価されます。
注意してください。 ifTrue:ifFalse: メッセージは
Pharo ではとてもよく使われています。 システムの心臓部なのです。
とても重要なので システム全体が遅くならないよう
実行効率のために高度に最適化されています。
Pharo での真偽値の実装の話に戻りましょう。
極めてエレガントです。
true および false というオブジェクトは それぞれ True クラスと False クラスのインスタンスで
いずれのクラスも Boolean クラスを継承しています。
これらのクラスはそれぞれ 期待された振る舞いをするように
一揃いのメソッドが実装されています。
このエレガントな実装については 別のレッスンで
掘り下げてみましょう。
ifTrue:ifFalse: メッセージの話に戻ります。
このメッセージには色々なバージョンがあります。
1つのブロックを引数にとる ifTrue: のみからなる バージョンもあり
分岐の最初の部分だけを返します。
ifTrue:ifFalse:メッセージは 2つのブロックを取り
真偽値が true か false かによって 分岐のいずれかを返します。
ここにいくつかの例があります。
これは ifTrue: メッセージを送り
ブロックを1つだけ渡して 表現式が true の場合のみ実行されます。
この例では 評価されるブロックは1つです。
もしレシーバーの真偽値が true ならば こちらのブロックが
もし false ならば こちらのブロックが実行されます。
これらはそれぞれ別々のメッセージです。
ifFalse: も同様で
Boolean、True、Falseといったクラス で扱われます。
条件分岐を表現するための 他の種類のメッセージも用意されています。
例えば、 ifEmpty:ifNotEmpty: という
コレクションに送るメッセージです。
ifEmpty: にブロックを渡します。
レシーバーのコレクションが空の場合にのみ ブロックが実行されます。
ifNotEmpty: はそれとは逆の条件です。
もしコレクションが空でなければ ブロックが実行されます。
もう1点。
このブロックは引数を1つ取ります。
渡されるのは空ではないコレクションです。
このコレクションは 何か複雑な計算をした結果かもしれません。
そのコレクションを得るために もう一度そのクエリーを実行することもできます。
もしコレクションが空ではない場合 ブロックに引数として渡されます。
そして渡されたコレクションを ブロックの表現式の中で使うことができます。
このセッションでは
Pharo では真偽値は通常のオブジェクトであり
Booleanクラスを継承するTrueクラスとFalseクラスの インスタンスであることを学びました。
それらの真偽値にメッセージを送ることができます。
それらのメッセージは Pharo での条件分岐や条件式を
構成するために定義されています。
他の言語ではそういった構造はコンパイラに依っています。