از نوع Option برای نمایش مقدارهایی استفاده میشود که ممکن است موجود باشند یا نباشند.
این نوع در ماژول gleam/option به شکل زیر تعریف شده است:
type Option(a) {
Some(a)
None
}
از سازندهی Some برای بستهبندی مقدار در زمانی که موجود است استفاده میشود و از سازندهی None برای نمایش نبود یک مقدار.
دسترسی به محتوای یک Option اغلب با تطبیق الگو انجام میشود.
import gleam/option.{type Option, None, Some}
pub fn say_hello(person: Option(String)) -> String {
case person {
Some(name) -> "Hello, " <> name <> "!"
None -> "Hello, Friend!"
}
}
say_hello(Some("Matthieu"))
// -> "Hello, Matthieu!"
say_hello(None)
// -> "Hello, Friend!"
ماژول gleam/option همچنین تعدادی تابع مفید برای کار با انواع Option تعریف میکند، مانند unwrap که محتوای یک Option را برمیگرداند یا اگر None باشد، یک مقدار پیشفرض را برمیگرداند.
import gleam/option.{type Option}
pub fn say_hello_again(person: Option(String)) -> String {
let name = option.unwrap(person, "Friend")
"Hello, " <> name <> "!"
}
جاش روی یک بازی نقشآفرینی جدید کار میکند و برای پیادهسازی برخی از مکانیکهای آن به کمک شما نیاز دارد.
تابع introduce را پیادهسازی کنید.
ممکن است بازیکنان پنهانکار اسمشان را پنهان کرده باشند و با "Mighty Magician" معرفی شوند. در غیر این صورت، برای معرفی او فقط از اسم خود بازیکن استفاده کنید.
introduce(Player(name: None, level: 2, health: 8, mana: None))
// -> "Mighty Magician"
introduce(Player(name: Some("Merlin"), level: 2, health: 8, mana: None))
// -> "Merlin"
تابع revive باید بررسی کند که شخصیت بازیکن واقعاً مرده است یا نه (سلامتش به ۰ رسیده است).
اگر مرده باشد، باید نمونهی جدیدی از Player با ۱۰۰ واحد سلامت برگرداند.
در غیر این صورت، اگر شخصیت بازیکن مرده نباشد، تابع revive مقدار None را برمیگرداند.
اگر سطح بازیکن ۱۰ یا بیشتر باشد، باید با ۱۰۰ واحد مانا هم احیا شود.
اگر سطح بازیکن کمتر از ۱۰ باشد، مانای او باید دستنخورده بماند.
تابع revive باید سطح بازیکن را حفظ کند.
let dead_player = Player(name: None, level: 2, health: 0, mana: None)
revive(dead_player)
// -> Some(Player(name: None, level: 2, health: 100, mana: None))
اگر متد revive روی بازیکنی فراخوانی شود که سلامت او ۱ یا بیشتر است، تابع باید None را برگرداند.
let alive_player = Player(name: None, level: 2, health: 42, mana: None)
revive(alive_player)
// -> None
تابع cast_spell بهعنوان آرگومان یک Int میگیرد که نشان میدهد طلسم چقدر مانا هزینه دارد، به همراه یک Player.
این تابع بازیکن بهروزشده را برمیگرداند و همچنین مقدار آسیبی که طلسم اجراشده وارد میکند.
یک اجرای موفق طلسم، آسیبی برابر با دو برابر هزینهی مانای طلسم وارد میکند.
اما اگر بازیکن مانای کافی نداشته باشد، هیچ اتفاقی نمیافتد، بازیکن بدون تغییر میماند و هیچ آسیبی وارد نمیشود.
اگر بازیکن حتی مخزن مانا هم نداشته باشد، تلاش برای اجرای طلسم باید سلامت او را به اندازهی هزینهی مانای طلسم کاهش دهد و هیچ آسیبی وارد نمیکند.
توجه داشته باشید که سلامت بازیکن نمیتواند کمتر از صفر (۰) باشد.
let wizard = Player(name: None, level: 18, health: 123, mana: Some(30))
let #(wizard, damage) = cast_spell(wizard, 14)
wizard.mana // -> Some 16
damage // -> 28