یک نوع زمانی نوع جنریک است که بتواند با استفاده از یک پارامتر نوع، مقادیر هر نوعی را در خود نگه دارد.
برای نمونه، این نوع Box پارامتر نوع a را دارد (که با حروف کوچک نوشته میشود).
pub type Box(a) {
Box(a)
}
پارامتر نوع a جانگهدار هر نوعی است، بنابراین میتوان از Box با رشتهها، عددهای صحیح یا هر نوع دیگری استفاده کرد.
Box("Hello, Joe!") // The type is Box(String)
Box(42) // The type is Box(Int)
یک نوع میتواند چندین پارامتر نوع داشته باشد که با ویرگول از هم جدا میشوند.
pub type Pair(a, b) {
Pair(a, b)
}
پارامترهای نوع را میتوان در آرگومانهای توابع هم به کار برد.
این تابع یک مقدار از نوع a میگیرد و تابعی را که یک a میگیرد و یک b برمیگرداند، دو بار فراخوانی میکند.
pub fn twice(value: a, f: fn(a) -> b) -> b {
f(value)
f(value)
}
// The type is fn(String, fn(String) -> Nil) -> Nil
twice("Hello, Joe!", io.println)
در این تمرین قرار است یک TreasureChest عمومی (یا به بیان بهتر، جادویی!) بنویسید تا گنجی را در آن ذخیره کنید.
یک نوع سفارشی TreasureChest با یک «گونه» تعریف کنید.
این گونه باید یک مقدار String همراه داشته باشد که برای ذخیرهی رمز صندوق گنج استفاده میشود.
این گونه همچنین باید یک مقدار عمومی همراه داشته باشد که برای ذخیرهی گنج استفاده میشود. این مقدار عمومی است تا گنج بتواند هرچه باشد.
یک نوع سفارشی UnlockResult با دو گونه تعریف کنید.
گونهی اول باید Unlocked باشد و یک مقدار عمومی را در خود نگه دارد که برای ذخیرهی گنج استفاده میشود.
گونهی دوم باید WrongPassword باشد که هیچ مقداری در خود نگه نمیدارد.
این تابع باید دو پارامتر بگیرد
TreasureChest
String (برای امتحان کردن رمز)این تابع باید رمز واردشده را با String موجود در TreasureChest بررسی کند.
تابع باید یک UnlockResult برگرداند.
اگر رمزها یکسان باشند، Unlocked را همراه با مقدار عمومی موجود در TreasureChest برگردانید (همان گنج!)
اگر رمزها یکسان نباشند، WrongPassword را برگردانید.