نوع دادهی سفارشی روشی است که با آن نوعهای دادهی جدید در Gleam تعریف میشوند. هر نوع دادهی سفارشی میتواند چندین «گونه» داشته باشد که هر کدام اسم خودش را دارد.
pub type Season {
Spring
Summer
Autumn
Winter
}
هر گونه از یک نوع دادهی سفارشی میتواند بهصورت اختیاری دادههایی را نگه دارد، و گونههای مختلف میتوانند نوعهای مختلفی از داده داشته باشند. وقتی یک گونه داده نگه میدارد، به آن «رکورد» میگویند.
pub type Number {
SomeInt(Int)
SomeFloat(Float)
Invalid
}
برای ساختن یک مقدار برای یک گونهی خاص، اگر دادهی اضافی نداشته باشد میتوان به اسم آن اشاره کرد (Spring)، و اگر داشته باشد آن را بهعنوان یک تابع فراخوانی کرد (SomeInt(2)).
let spring = Spring
let integerTwo = SomeInt(2)
نوعهای دادهی سفارشی، همراه با همهچیز در Gleam، «برابری ساختاری» دارند، یعنی دو مقدار از یک گونه و با دادهی یکسان، معادل هستند.
Spring == Spring // -> True
Spring == Autumn // -> False
SomeInt(2) == SomeInt(2) // -> True
SomeInt(2) == SomeFloat(2.0) // -> False
میتوان با استفاده از عبارتهای case روی گونههای نوع دادهی سفارشی تطبیق الگو انجام داد.
import gleam/int
import gleam/float
pub fn describe(flexible_number: Number) -> String {
case flexible_number {
SomeFloat(f) -> "Float: " <> float.to_string(f)
SomeInt(i) -> "Int: " <> int.to_string(i)
Invalid -> "Neither a float nor an int"
}
}
در این تمرین، روز ولنتاین است و شما و همراهتان قصد دارید با هم کار قشنگی انجام دهید. همراهتان ایدههای زیادی دارد و حالا از شما میخواهد که ایدهها را ارزیابی کنید تا فعالیتی را که میخواهید در آن شرکت کنید پیدا کنید.
ایدههای زیر را همراهتان پیشنهاد کرده است:
شش کار دارید که به شما کمک میکنند فعالیت روز ولنتاین را انتخاب کنید.
برای هر ایدهای که همراهتان پیشنهاد میکند، شما با یکی از سه گزینه پاسخ میدهید: بله، خیر یا شاید.
یک «نوع سفارشی» به اسم Approval تعریف کنید که این گزینهها را بهصورت سه حالت زیر نشان میدهد: Yes، No و Maybe.
همراهتان دو رستوران ممکن را انتخاب کرده است: یکی با آشپزی کرهای و دیگری با آشپزی ترکی.
یک نوع سفارشی به اسم Cuisine تعریف کنید که این آشپزیها را بهصورت دو حالت زیر نشان میدهد: Korean و Turkish.
فیلمهای بیشماری برای انتخاب وجود دارد؛ بنابراین برای محدودتر کردن انتخابها، همراهتان ژانر آنها را هم فهرست میکند.
یک نوع سفارشی به اسم Genre تعریف کنید که ژانرهای زیر را بهعنوان حالتها نشان میدهد: Crime، Horror، Romance و Thriller.
همانطور که گفتیم، همراهتان پنج فعالیت مختلف پیشنهاد کرده است: بازی رومیزی، استراحت، تماشای فیلم، رفتن به رستوران و پیادهروی.
یک نوع سفارشی به اسم Activity تعریف کنید که این انواع فعالیت را نشان میدهد:
BoardGame: بدون دادهی همراه.Chill: بدون دادهی همراه.Movie: Genre را بهعنوان دادهی همراه دارد.Restaurant: Cuisine را بهعنوان دادهی همراه دارد.Walk: یک Int بهعنوان دادهی همراه دارد که تعداد کیلومترهای پیادهروی را نشان میدهد.بالاخره آمادهاید ایدههای همراهتان را ارزیابی کنید. نظر شما دربارهی ایدهی همراهتان این است:
تابعی به اسم rate_activity پیادهسازی کنید که یک مقدار Activity میگیرد و بر اساس احساسهای بالا مقدار Approval را برمیگرداند:
rate_activity(Restaurant(Turkish))
// -> Maybe