Elixirでは、trueとfalseという値を真偽値型で表します。値はtrueとfalseの2つだけです。これらの値は変数に束縛できます。
true_variable = true
false_variable = false
and/2、or/2、not/1演算子を使うと、厳密な真偽値の式を評価できます。
true_variable = true and true
false_variable = true and false
true_variable = false or true
false_variable = false or false
true_variable = not false
false_variable = not true
真偽値を戻す関数を書くときは、関数名の末尾に?を付けるのが慣習的です。真偽値を保持する変数にも、同じ慣習が使えます。
def either_true?(a?, b?) do
a? or b?
end
この演習では、名作ゲーム「パックマン」のルールをElixirの関数に置き換えていきます。
置き換えるルールは4つあり、どれもゲームの状態に関するものです。
引数がどのように導かれるかは気にしなくて大丈夫です。引数を組み合わせて、意図した結果を返すことだけに集中しましょう。
2つの引数(パワーエサの効果が有効かどうか と パックマンがゴーストに触れているかどうか)を受け取り、パックマンがゴーストを食べられるかどうかを示す真偽値を返すRules.eat_ghost?/2関数を定義します。この関数は、パワーエサの効果が有効で、かつパックマンがゴーストに触れているときだけtrueを返します。
Rules.eat_ghost?(false, true)
# => false
2つの引数(パックマンがパワーエサに触れているかどうか と パックマンがドットに触れているかどうか)を受け取り、パックマンが得点したかどうかを示す真偽値を返すRules.score?/2関数を定義します。この関数は、パックマンがパワーエサかドットに触れているときにtrueを返します。
Rules.score?(true, true)
# => true
2つの引数(パワーエサの効果が有効かどうか と パックマンがゴーストに触れているかどうか)を受け取り、パックマンが負けたかどうかを示す真偽値を返すRules.lose?/2関数を定義します。この関数は、パックマンがゴーストに触れていて、かつパワーエサの効果が有効でないときにtrueを返します。
Rules.lose?(false, true)
# => true
3つの引数(パックマンがすべてのドットを食べたかどうか、パワーエサの効果が有効かどうか、パックマンがゴーストに触れているかどうか)を受け取り、パックマンが勝ったかどうかを示す真偽値を返すRules.win?/3関数を定義します。この関数は、パックマンがすべてのドットを食べていて、かつ3番で定義した引数に基づいて負けていないときにtrueを返します。
Rules.win?(false, true, false)
# => false