一个类型如果可以使用类型参数容纳任意类型的值,那么它就是泛型类型。
例如,下面这个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。
如果密码匹配,就返回Unlocked,并带上TreasureChest中的泛型值(也就是宝藏!)。
如果密码不匹配,就返回WrongPassword。