I generici ti permettono di scrivere codice che funziona con più tipi senza duplicazioni.
Definisci i tipi generici usando le parentesi angolari (<T>), dove T è un segnaposto per
qualsiasi tipo.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo richiede vincoli sui trait per specificare quali operazioni il tipo generico deve
supportare. Puoi aggiungere i vincoli usando la sintassi +:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
Anche le struct possono essere generiche:
#[derive(Drop)]
struct Container<T> {
value: T,
}
Anche i trait possono essere generici, il che permette loro di funzionare con tipi diversi:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
Le funzioni possono accettare parametri generici con vincoli sui trait, così da funzionare con qualsiasi tipo che implementi il trait richiesto:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
Il nuovo aeroporto di Berlino ti ha assunto come sviluppatore per il laboratorio dei suoi robot. Hanno dei robot goffi, dall'aspetto un po' umanoide, che stanno cercando di usare per migliorare il servizio clienti.
Il tuo primo incarico è programmare il robot perché saluti le persone nella loro lingua madre dopo aver scansionato il passaporto al banco del check-in automatico.
Il robot è orgoglioso delle sue capacità, quindi dirà sempre prima quale lingua sa parlare e poi saluterà la persona. Per esempio, se qualcuno scansiona un passaporto tedesco, il robot dirà:
I can speak German: Hallo Dietrich!
Devi strutturare il codice in modo che tu e gli altri sviluppatori possiate aggiungere lingue facilmente.
Come primo passo, definisci un trait Greeter con due funzioni.
language_name che restituisce la lingua (un ByteArray) che il robot userà per salutare il visitatore.greet che accetta il nome di un visitatore (un ByteArray) e restituisce il messaggio di saluto in una lingua specifica (un ByteArray).Poi implementa una funzione say_hello che accetta il nome del visitatore e qualcosa che implementa il trait Greeter e restituisce il saluto desiderato (un ByteArray).
Per esempio, immagina un'implementazione tedesca di Greeter in cui language_name restituisce "German" e greet restituisce "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Ora fai in modo che il robot funzioni per le persone che scansionano passaporti italiani.
Crea lo struct Italian e implementa le due funzioni per soddisfare il trait Greeter del compito 1.
Puoi salutare qualcuno in italiano con "Ciao {name}!".
Prima di chiudere la giornata, dovresti aggiungere la funzionalità per salutare le persone in francese.
Crea lo struct French e implementa le due funzioni per soddisfare il trait Greeter.
Puoi salutare qualcuno in francese con "Bonjour {name}!".
Iscriviti a Exercism per imparare e padroneggiare Cairo con 25 concetti68 esercizi e il mentoring di persone reali, tutto gratis.