Os genéricos permitem-te escrever código que funciona com vários tipos sem duplicação.
Define tipos genéricos com sinais de menor e maior, <T>, em que T é um marcador para qualquer tipo.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
O Cairo exige limites de trait para especificar que operações o tipo genérico tem de suportar.
Podes adicionar restrições com a sintaxe +:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
As estruturas também podem ser genéricas:
#[derive(Drop)]
struct Container<T> {
value: T,
}
As traits também podem ser genéricas, o que lhes permite funcionar com tipos diferentes:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
As funções podem aceitar parâmetros genéricos com limites de trait. Assim, funcionam com qualquer tipo que implemente o trait necessário:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
O novo aeroporto de Berlim contratou-te como programador para o laboratório de robôs. Têm robôs desajeitados e com um aspeto algo humanoide, que estão a tentar usar para melhorar o atendimento ao cliente.
A tua primeira tarefa é programar o robô para cumprimentar as pessoas na sua língua nativa depois de estas digitalizarem os passaportes no balcão de check-in automático.
O robô tem orgulho nas suas capacidades, por isso diz sempre primeiro que língua consegue falar e só depois cumprimenta a pessoa. Por exemplo, se alguém digitalizar um passaporte alemão, o robô diria:
I can speak German: Hallo Dietrich!
Precisas de estruturar o teu código para que tu e outros programadores possam adicionar línguas facilmente.
Como primeiro passo, define uma trait Greeter com duas funções.
language_name, que devolve a língua (um ByteArray) que o robô vai usar para cumprimentar o visitante.greet, que recebe o nome do visitante (um ByteArray) e devolve a mensagem de saudação numa língua específica (um ByteArray).De seguida, implementa uma função say_hello que recebe o nome do visitante e algo que implementa a trait Greeter, e devolve a saudação pretendida (um ByteArray).
Por exemplo, imagina uma implementação de Greeter em alemão para a qual language_name devolve "German" e greet devolve "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Agora faz com que o robô funcione para as pessoas que digitalizam passaportes italianos.
Cria uma struct Italian e implementa as duas funções para cumprir a trait Greeter da tarefa 1.
Podes cumprimentar alguém em italiano com "Ciao {name}!".
Antes de dares o dia por terminado, deves acrescentar a funcionalidade de cumprimentar as pessoas em francês.
Cria uma struct French e implementa as duas funções para cumprir a trait Greeter.
Podes cumprimentar alguém em francês com "Bonjour {name}!".
Inscreve-te no Exercism para aprenderes e dominares Cairo com 25 conceitos68 exercícios, e mentoria humana real, tudo grátis.