當一個型別能使用_型別參數_來容納任何型別的值時,它就是_泛型型別_。
例如,這個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(用來嘗試密碼)這個函式應該拿傳入的密碼嘗試,去比對TreasureChest裡的String。
這個函式應該回傳一個UnlockResult。
如果密碼相符,就回傳帶有TreasureChest中泛型值(也就是寶藏!)的Unlocked。
如果密碼不相符,就回傳WrongPassword。