case
در Gleam میتوان از عبارت case برای اجرای شرطی کد استفاده کرد. با عبارت case میتوان یک مقدار را در برابر یک یا چند «الگو» آزمود. نمونهای از چنین الگویی «الگوی مقدار ثابت» است که یک مقدار را با یک مقدار ثابت (مثلاً 1 یا "hello") تطبیق میدهد.
عبارت case با کلیدواژهی case نوشته میشود:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
1 -> "One"
}
}
گرچه ممکن است این شبیه دستورهای switch در زبانهای دیگر به نظر برسد، تطبیق الگو زمانی میدرخشد که از الگوهای دیگر هم استفاده کنید. یکی از این الگوها «الگوی متغیر» است که به کمک آن میتوان به یک متغیر مقدار داد. در این مثال، اگر number برابر 0 نباشد، مقدار آن به متغیر i اختصاص داده میشود:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i -> "Non zero"
}
}
در برخی موارد ممکن است بخواهید شرطی دیگر به یک الگو اضافه کنید. به این کار «نگهبان» (بند) میگویند که میتوان آن را با کلیدواژهی if اضافه کرد:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
}
}
به دلایل عملکردی، در نگهبانها فقط عملگرهای پایهی ریاضی و عملگرهای «منطقی» مجاز هستند و از توابع دیگر نمیتوان در نگهبانها استفاده کرد.
در مثال بالا، همهی ورودیهای ممکن الگوی متناظر ندارند. کامپایلر این را تشخیص میدهد و خطایی نمایش میدهد. به این کار «بررسی جامع» میگویند. برای رفع این هشدار باید همهی حالتها را پوشش داد. برای این کار میتوان از «الگوی نادیدهگیری» استفاده کرد که الگویی است و با هر مقداری تطبیق مییابد:
pub fn describe(number: Int) -> String {
case number {
0 -> "Zero"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
در یک بند میتوان چندین الگو را تطبیق داد و هر الگو را با | از الگوی دیگر جدا کرد. به هر بند فقط یک نگهبان میتوان اضافه کرد:
pub fn describe(number: Int) -> String {
let yell = True
case number {
0 -> "Zero"
3 | 5 -> "One of the first odd prime numbers"
2 | 4 | 6 | 8 if !yell -> "One of the even numbers less than 10"
i if i % 2 == 0 && yell -> "[Yelling] I'm telling you! It's a even nunber"
i if i < 0 -> "Negative number"
_ -> "Positive number"
}
}
// No compiler error
عبارت case مقدار را از بالا به پایین با هر الگو میآزماید تا الگوی منطبق را پیدا کند و کد مربوط به آن الگو را اجرا کند. ترتیب الگوها مهم است!
در این تمرین، دارید با یک دوست بازی حدس عدد انجام میدهید. قواعد بازی ساده است: شما بهطور مخفیانه عددی بین 1 و 100 انتخاب میکنید و دوستتان تلاش میکند حدس بزند چه عددی را انتخاب کردهاید. برای کمک به دوستتان، بسته به اینکه حدس چقدر به عددی که انتخاب کردهاید (42) نزدیک بوده، پاسخ متفاوتی میدهید. قواعد پاسخهای مختلف اینهاست:
42 باشد: «Correct»41 یا 43 باشد: «So close»41 باشد: «Too low»43 باشد: «Too high»چهار کار دارید تا پاسخ حدسها را پیادهسازی کنید.
تابع reply را پیادهسازی کنید تا به یک حدس درست پاسخ دهد:
reply(42)
// -> "Correct"
تابع reply را تغییر دهید تا به حدسهای نزدیک پاسخ دهد:
reply(41)
// -> "So close"
تابع reply را تغییر دهید تا به حدسهای خیلی پایین پاسخ دهد:
reply(25)
// -> "Too low"
تابع reply را تغییر دهید تا به حدسهای خیلی بالا پاسخ دهد:
reply(88)
// -> "Too high"