nilnil واژهای انگلیسی به معنای «هیچ» یا «صفر» است. در Elixir، nil یک مقدار ویژه است که به معنای نبودِ یک مقدار است.
# I do not have a favorite color
favorite_color = nil
در زبانهای برنامهنویسی دیگر، ممکن است مقادیر null یا none نقش مشابهی داشته باشند.
ifعلاوه بر cond، Elixir ماکروی if/2 را هم فراهم میکند که وقتی لازم است فقط یک شرط را بررسی کنید، به کار میآید.
if/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 را در یک خط هم نوشت. به ویرگولِ بعد از شرط دقت کنید.
if age > 16, do: "beer", else: "no beer"
این نحوهی نگارش برای عبارتهای خیلی کوتاه مفید است، اما اگر عبارت در یک خط جا نشود، باید از آن پرهیز کرد.
در Elixir، همهی انواع داده وقتی در یک بافت «منطقی» (مانند یک عبارت if) قرار میگیرند، به یک مقدار درستنما یا غلطنما ارزیابی میشوند. همهی دادهها درستنما به حساب میآیند بهجز false و nil. بهویژه، رشتههای خالی، عدد صحیح 0 و لیستهای خالی همگی در Elixir درستنما به حساب میآیند.
در این تمرین کدی مینویسید که برای کارمندان کارخانه نشان اسم چاپ میکند. هر کارمند یک شناسه، یک اسم و یک اسم دپارتمان دارد. برچسب نشان کارمندان به این شکل قالببندی میشود: "[id] - name - DEPARTMENT".
تابع NameBadge.print/3 را پیادهسازی کنید. این تابع باید یک id، یک name و یک department بگیرد و برچسب نشان را با اسم دپارتمان بهصورت حروف بزرگ برگرداند.
NameBadge.print(67, "Katherine Williams", "Strategic Communication")
# => "[67] - Katherine Williams - STRATEGIC COMMUNICATION"
به دلیل یک ایراد عجیب در سیستم رایانهای، گاهی کارمندان جدید هنگام شروع کار در کارخانه هنوز شناسه ندارند. چون همراه داشتن نشان الزامی است، یک نشان موقت بدون پیشوند شناسه دریافت میکنند.
تابع NameBadge.print/3 را گسترش دهید. وقتی id وجود ندارد، باید نشانی بدون آن چاپ کند.
NameBadge.print(nil, "Robert Johnson", "Procurement")
# => "Robert Johnson - PROCUREMENT"
حتی صاحب کارخانه هم باید همیشه یک نشان همراه داشته باشد. اما صاحب کارخانه دپارتمان ندارد. در این حالت، برچسب باید بهجای اسم دپارتمان "OWNER" را چاپ کند.
تابع NameBadge.print/3 را گسترش دهید. وقتی department وجود ندارد، فرض کنید که نشان به صاحب کارخانه تعلق دارد.
NameBadge.print(204, "Rachel Miller", nil)
# => "[204] - Rachel Miller - OWNER"
توجه کنید که ممکن است صاحب کارخانه هم کارمند جدیدی باشد.
NameBadge.print(nil, "Rachel Miller", nil)
# => "Rachel Miller - OWNER"