泛型讓你寫出可處理多種型別、又不必重複的程式碼。使用角括號 <T> 來定義泛型型別,其中 T 是任何型別的佔位符。
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo 要求使用 trait 界限來說明泛型型別必須支援哪些操作。你可以用 + 語法來加上限制:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
結構體也可以是泛型的:
#[derive(Drop)]
struct Container<T> {
value: T,
}
trait 也能是泛型的,因此可以搭配不同的型別使用:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
函式可以接受帶有 trait 界限的泛型參數,讓它能用在任何實作了所需 trait 的型別上:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
柏林的新機場聘請你擔任他們機器人實驗室的開發者。 他們有笨重、看起來有點像人形的機器人,正試著用它們來改善客戶服務。
你到職後的第一項任務,就是寫程式讓機器人在自助報到櫃檯掃描護照後,用對方的母語向他們問候。
機器人對自己的能力很自豪,所以它總是先說自己會說哪種語言,再向對方問候。 例如,如果有人掃描德國護照,機器人會說:
I can speak German: Hallo Dietrich!
你需要把程式碼組織好,讓你和其他的開發者都能輕鬆加入新的語言。
第一步,定義一個 trait Greeter,裡面包含兩個函式。
language_name:回傳機器人用來向訪客問候的語言(ByteArray)。greet:接受訪客的名字(ByteArray),並回傳以特定語言表達的問候訊息(ByteArray)。接著,實作一個函式say_hello,它接受訪客的名字,以及任何實作了Greeter trait 的東西,並回傳想要的問候訊息(ByteArray)。
例如,想像一個德文版的Greeter實作,它的language_name回傳"German",而greet回傳"Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
現在讓機器人也能為掃描義大利護照的人服務。
建立一個 struct Italian,並實作那兩個函式來滿足任務 1 的Greeter trait。
你可以用"Ciao {name}!"向人問候。
在收工之前,你還得加上用法文向人問候的功能。
建立一個 struct French,並實作那兩個函式來滿足Greeter trait。
你可以用"Bonjour {name}!"向人問候。