Los genéricos te permiten escribir código que funciona con varios tipos sin duplicarlo.
Define tipos genéricos con corchetes angulares <T>, donde T es un marcador de posición para cualquier tipo.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo requiere restricciones de trait para especificar qué operaciones debe admitir el tipo genérico.
Puedes añadir restricciones con la sintaxis +:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
Las estructuras también pueden ser genéricas:
#[derive(Drop)]
struct Container<T> {
value: T,
}
Los traits también pueden ser genéricos, lo que les permite funcionar con tipos distintos:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
Las funciones pueden aceptar parámetros genéricos con restricciones de trait, lo que hace que funcionen con cualquier tipo que implemente el trait requerido:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
El nuevo aeropuerto de Berlín te contrató como desarrollador para su laboratorio de robots. Tienen unos robots torpes, de aspecto un tanto humanoide, que están intentando usar para mejorar la atención al cliente.
Tu primera tarea en el trabajo es programar el robot para que salude a las personas en su idioma nativo después de que hayan escaneado sus pasaportes en el mostrador de facturación automática.
El robot está orgulloso de sus habilidades, así que siempre dirá primero qué idioma sabe hablar y después saludará a la persona. Por ejemplo, si alguien escanea un pasaporte alemán, el robot diría:
I can speak German: Hallo Dietrich!
Necesitas estructurar tu código para que tú y otros desarrolladores podáis añadir idiomas fácilmente.
Como primer paso, define un trait Greeter con dos funciones.
language_name, que devuelve el idioma (un ByteArray) que el robot usará para saludar al visitante.greet, que acepta el nombre de un visitante (un ByteArray) y devuelve el mensaje de saludo en un idioma concreto (un ByteArray).A continuación, implementa una función say_hello que acepte el nombre del visitante y algo que implemente el trait Greeter, y que devuelva el saludo deseado (un ByteArray).
Por ejemplo, imagina una implementación alemana de Greeter en la que language_name devuelve "German" y greet devuelve "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Ahora haz que el robot funcione para las personas que escaneen pasaportes italianos.
Crea un struct Italian e implementa las dos funciones para cumplir con el trait Greeter de la tarea 1.
Puedes saludar a alguien en italiano con "Ciao {name}!".
Antes de dar por terminado el día, se supone que debes añadir funcionalidad para saludar a la gente en francés.
Crea un struct French e implementa las dos funciones para cumplir con el trait Greeter.
Puedes saludar a alguien en francés con "Bonjour {name}!".
Regístrate en Exercism para aprender y dominar Cairo con 25 conceptos68 ejercicios y mentoría humana real, todo gratis.