學習軌道
/
Cairo
Cairo
/
練習
/
機場機器人
機場機器人

機場機器人

學習練習

簡介

泛型讓你寫出可處理多種型別、又不必重複的程式碼。使用角括號 <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!

1. 建立抽象的問候功能

你需要把程式碼組織好,讓你和其他的開發者都能輕鬆加入新的語言。

第一步,定義一個 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!"

2. 實作義大利文

現在讓機器人也能為掃描義大利護照的人服務。

建立一個 struct Italian,並實作那兩個函式來滿足任務 1 的Greeter trait。 你可以用"Ciao {name}!"向人問候。

3. 實作法文

在收工之前,你還得加上用法文向人問候的功能。

建立一個 struct French,並實作那兩個函式來滿足Greeter trait。 你可以用"Bonjour {name}!"向人問候。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Cairo Exercism

準備好開始 機場機器人 了嗎?

註冊 Exercism,透過 25 個概念68 個練習 和真人引導來學習並精通 Cairo,全部免費。