12章は制御フロー。といっても、パターンマッチとガード説で制御フローの大半を作ってしまうので、Elixirでは登場頻度は低い。
ifは今までの構文と同じようにdo:を指定できる。さらにelse:も指定できる。 この構文の特徴をもう一度確認しておこう。
iex> if(true, [do: "hoge", else: "fuga"]) "hoge"
このように、ifは2つの引数を取る。1つ目が条件、2つ目はキーワードリストだ。else:はなくてもいい。
で、関数呼び出しの括弧は省略できる。最後の引数がキーワードリストの場合、リストの角括弧も省略できる。
iex> if true, do: "hoge", else: "fuga" "hoge"
さらにdo:はブロックのように書くシンタックスシュガーがある
iex> if true do ...> "hoge" ...> else ...> "fuga" ...> end "hoge"
面白いね。
ついでに、Rubyと同じようにunlessもある。Rubyのunlessは後置で早期リターンに使うのが便利。 それ以外で使うと混乱しがち。特にunlessにelseを付けると大混乱しがち。 それを踏まえると、Elixirのunlessはどういうときに使うんだろう?
次はcond。true/falseを返す条件式を使って、if..elsif..elseみたいなことがしたいときに使う。 条件じゃなくて、パターンマッチで実行するコードを選びたければ、caseを使う。 この2つの文法はよく似てる。
Elixirには例外もある。raise "xxx"
でメッセージと共にRuntimeErrorを起こせる。
まあ、あんまり積極的には使わないものらしい。