Elixir با اجازه دادن به توابع برای داشتن چندین شاخه، به رعایت Open-Closed Principle کمک میکند؛ بنابراین بهجای منطق کنترلی پراکنده و سختکدشده، میتوان توابعی هدفمند نوشت که افزودن یا حذف رفتار را آسان میکنند.
Elixir برای نوشتن اینها، «شاخههای متعدد تابع» و «گاردها» را در اختیار شما میگذارد:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
هنگام اجرا، Elixir از بالای فایل منبع به پایین بررسی میکند که کدام شاخهی تابع را فراخوانی کند.
متغیرهای بلااستفاده باید با زیرخط شروع شوند.
گاردها جلوی این را میگیرند که Elixir بر اساس ارزیابی آرگومانها توسط توابع گارد، تابع را فراخوانی کند. گاردها با کلیدواژهی when شروع میشوند و پس از آن یک عبارت منطقی میآید. توابع گارد، توابعی ویژه هستند که:
true یا false برگردانند.فهرستی از گاردهای رایج را میتوانید در مستندات Elixir پیدا کنید. این فهرست شامل بررسی نوع، حساب پایه، مقایسهها و عملگرهای صرفاً منطقی است.
توابع میتوانند برای یک یا چند آرگومان مقدار پیشفرض تعریف کنند. بیایید این تابع را در نظر بگیریم:
def number(n \\ 13), do: "That's not my favorite"
هنگام کامپایل، Elixir برای number/0 (بدون آرگومان) و number/1 (یک آرگومان) تعریف تابع میسازد.
اگر بیش از یک آرگومان مقدار پیشفرض داشته باشد، مقادیر پیشفرض از چپ به راست روی تابع اعمال میشوند تا آرگومانهای جاافتاده را پر کنند.
اگر تابع بیش از یک شاخه داشته باشد، آرگومانهای پیشفرض باید در سرآیند تابع (تابعی بدون بدنه) و پیش از شاخههای تابع تعریف شوند:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
شما در حال ساختن یک بازی آنلاین ساده هستید که در آن یک دوست میتواند یک عدد مخفی را حدس بزند. میخواهید کمی بازخورد بدهید، اما با یک حدس پاسخ را لو ندهید. باید تابعی طراحی کنید که بسته به این که حدس با عدد مخفی چه رابطهای دارد، پاسخهای متفاوتی بدهد.
| شرط | پاسخ |
|---|---|
| وقتی حدس با عدد مخفی مطابقت دارد | "Correct" |
| وقتی حدس یکی بیشتر یا یکی کمتر از عدد مخفی است | "So close" |
| وقتی حدس بزرگتر از عدد مخفی است | "Too high" |
| وقتی حدس کوچکتر از عدد مخفی است | "Too low" |
| وقتی حدسی زده نمیشود | "Make a guess" |
همهی حدسها و عددهای مخفی، اعداد صحیح هستند.
تابع compare/2 را پیادهسازی کنید که دو آرگومان میگیرد، secret_number و guess، که هر دو عدد صحیح هستند.
GuessingGame.compare(5, 5)
# => "Correct"
تابع compare را تغییر دهید تا به حدسهایی که از عدد مخفی بزرگترند پاسخ دهد.
GuessingGame.compare(5, 8)
# => "Too high"
تابع compare را تغییر دهید تا به حدسهایی که از عدد مخفی کوچکترند پاسخ دهد.
GuessingGame.compare(5, 2)
# => "Too low"
تابع compare را تغییر دهید تا به حدسهایی که به عدد مخفی نزدیکاند پاسخ دهد.
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
تابع compare را تغییر دهید تا وقتی حدسی وجود ندارد پاسخ دهد.
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"