nilnilは、英語で「何もない」や「ゼロ」を意味する言葉です。Elixirでは、nilは値が_存在しない_ことを表す特別な値です。
# I do not have a favorite color
favorite_color = nil
ほかのプログラミング言語では、nullやnoneという値が同じような役割を果たすことがあります。
ifcondのほかに、Elixirにはif/2というマクロもあります。これは、条件を1つだけ調べたいときに役立ちます。
if/2は、条件と2つの選択肢を受け取ります。条件が_真とみなされる_場合は1つ目の選択肢を、_偽とみなされる_場合は2つ目の選択肢を返します。
age = 15
if age >= 16 do
"You are allowed to drink beer in Germany."
else
"No beer for you!"
end
# => "No beer for you!"
if式を1行で書くこともできます。条件のあとにカンマがあることに注目してください。
if age > 16, do: "beer", else: "no beer"
この書き方は、ごく短い式には便利ですが、1行に収まらない式には使わないようにしましょう。
Elixirでは、すべてのデータ型は、if式のような真偽値の文脈で出てくると、_真とみなされる値_か_偽とみなされる値_のどちらかに評価されます。falseとnil以外のデータは、すべて_真とみなされる値_と見なされます。特に、空の文字列、整数の0、空のリストは、Elixirではすべて_真とみなされる値_です。
この演習では、工場の従業員向けの名札を出力するコードを書きます。従業員にはID、名前、部署名があります。従業員の名札のラベルは、"[id] - name - DEPARTMENT"という形式です。
NameBadge.print/3関数を実装します。ID、名前、部署を受け取り、部署名を大文字にした名札のラベルを返します。
NameBadge.print(67, "Katherine Williams", "Strategic Communication")
# => "[67] - Katherine Williams - STRATEGIC COMMUNICATION"
コンピューターシステムのちょっとした仕様により、新しい従業員は、工場で働き始めた時点ではまだIDを持っていないことがあります。名札は必須なので、IDの接頭辞のない一時的な名札を受け取ります。
NameBadge.print/3関数を拡張します。IDがないときは、IDのない名札を出力します。
NameBadge.print(nil, "Robert Johnson", "Procurement")
# => "Robert Johnson - PROCUREMENT"
工場のオーナーでさえ、常に名札を着用しなければなりません。ただし、オーナーには部署がありません。この場合、ラベルには部署名の代わりに"OWNER"と出力します。
NameBadge.print/3関数を拡張します。部署がないときは、その名札は会社のオーナーのものだとみなします。
NameBadge.print(204, "Rachel Miller", nil)
# => "[204] - Rachel Miller - OWNER"
オーナーが新しい従業員でもある場合があることに注意してください。
NameBadge.print(nil, "Rachel Miller", nil)
# => "Rachel Miller - OWNER"