Genéricos permitem escrever código que funciona com vários tipos sem duplicação.
Defina tipos genéricos usando sinais de maior e menor <T>, em que T é um espaço reservado para qualquer tipo.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo exige limites de trait para especificar quais operações o tipo genérico precisa suportar.
Você pode adicionar restrições usando a sintaxe +:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
Structs também podem ser genéricas:
#[derive(Drop)]
struct Container<T> {
value: T,
}
Traits também podem ser genéricas, o que permite que funcionem 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"
}
}
Funções podem aceitar parâmetros genéricos com limites de trait, o que as faz funcionar 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 você como desenvolvedor do laboratório de robôs. Eles têm robôs desajeitados e meio humanoides que estão tentando usar para melhorar o atendimento ao cliente.
Sua primeira tarefa no trabalho é programar o robô para cumprimentar as pessoas no idioma nativo delas depois que elas escaneiam o passaporte no balcão de check-in automático.
O robô tem orgulho de suas habilidades, então ele sempre diz primeiro em qual idioma consegue falar e depois cumprimenta a pessoa. Por exemplo, se alguém escaneia um passaporte alemão, o robô diria:
I can speak German: Hallo Dietrich!
Você precisa estruturar seu código para que você e outros desenvolvedores possam adicionar idiomas com facilidade.
Como primeiro passo, defina uma trait Greeter com duas funções.
language_name, que retorna o idioma (um ByteArray) que o robô vai usar para cumprimentar o visitante.greet, que recebe o nome do visitante (um ByteArray) e retorna a mensagem de saudação em um idioma específico (um ByteArray).Em seguida, implemente uma função say_hello que recebe o nome do visitante e algo que implementa a trait Greeter e retorna a saudação desejada (um ByteArray). Por exemplo, imagine uma implementação de Greeter em alemão em que language_name retorna "German" e greet retorna "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Agora faça o robô funcionar para as pessoas que escaneiam passaportes italianos.
Crie uma struct Italian e implemente as duas funções para cumprir a trait Greeter da tarefa 1. Você pode cumprimentar alguém em italiano com "Ciao {name}!".
Antes de encerrar o dia, você deve adicionar a funcionalidade de cumprimentar as pessoas em francês.
Crie uma struct French e implemente as duas funções para cumprir a trait Greeter. Você pode cumprimentar alguém em francês com "Bonjour {name}!".
Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.