Trilhas
/
Cairo
Cairo
/
Exercícios
/
Robô de aeroporto
Robô de aeroporto

Robô de aeroporto

Exercício de aprendizagem

Introdução

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()
}

Instruções

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!

1. Crie a funcionalidade abstrata de saudação

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!"

2. Implemente o italiano

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}!".

3. Implemente o francês

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}!".

Editar via GitHub O link abre em uma nova janela ou aba
Cairo Exercism

Tudo pronto para começar Robô de aeroporto?

Crie sua conta no Exercism para aprender e dominar Cairo com 25 conceitos68 exercícios e mentoria humana de verdade, tudo de graça.