Mit Generics kannst du Code schreiben, der mit mehreren Typen funktioniert, ohne ihn zu duplizieren. Definiere generische Typen mit spitzen Klammern <T>, wobei T ein Platzhalter für einen beliebigen Typ ist.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
Cairo verlangt Trait-Bounds, um festzulegen, welche Operationen der generische Typ unterstützen muss. Du kannst Einschränkungen mit der +-Syntax hinzufügen:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
Auch Structs können generisch sein:
#[derive(Drop)]
struct Container<T> {
value: T,
}
Auch Traits können generisch sein, sodass sie mit verschiedenen Typen funktionieren:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
Funktionen können generische Parameter mit Trait-Bounds annehmen, sodass sie mit jedem Typ funktionieren, der den erforderlichen Trait implementiert:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
Der neue Flughafen in Berlin hat dich als Entwickler für sein Robotiklabor eingestellt. Sie haben klobige, etwas humanoide Roboter, mit denen sie den Kundenservice verbessern wollen.
Deine erste Aufgabe im Job ist es, den Roboter so zu programmieren, dass er die Leute in ihrer Muttersprache begrüßt, nachdem sie ihren Pass am Self-Check-in-Schalter gescannt haben.
Der Roboter ist stolz auf seine Fähigkeiten, deshalb sagt er immer zuerst, welche Sprache er spricht, und begrüßt dann die Person. Wenn zum Beispiel jemand einen deutschen Pass scannt, sagt der Roboter:
I can speak German: Hallo Dietrich!
Du musst deinen Code so strukturieren, dass du und andere Entwickler leicht weitere Sprachen hinzufügen können.
Definiere als ersten Schritt ein Trait Greeter mit zwei Funktionen.
language_name, das die Sprache (ein ByteArray) zurückgibt, mit der der Roboter den Besucher begrüßt.greet, das den Namen eines Besuchers (ein ByteArray) entgegennimmt und die Begrüßungsnachricht in einer bestimmten Sprache (ein ByteArray) zurückgibt.Implementiere als Nächstes eine Funktion say_hello, die den Namen des Besuchers und etwas entgegennimmt, das das Greeter-Trait implementiert, und die gewünschte Begrüßung (ein ByteArray) zurückgibt.
Stell dir zum Beispiel eine deutsche Greeter-Implementierung vor, bei der language_name "German" zurückgibt und greet "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
Sorge jetzt dafür, dass der Roboter auch für Leute funktioniert, die einen italienischen Pass scannen.
Erstelle ein Struct Italian und implementiere die beiden Funktionen, um das Greeter-Trait aus Aufgabe 1 zu erfüllen.
Du kannst jemanden auf Italienisch mit "Ciao {name}!" begrüßen.
Bevor du Feierabend machst, sollst du noch die Möglichkeit ergänzen, Leute auf Französisch zu begrüßen.
Erstelle ein Struct French und implementiere die beiden Funktionen, um das Greeter-Trait zu erfüllen.
Du kannst jemanden auf Französisch mit "Bonjour {name}!" begrüßen.
Melde dich bei Exercism an, um Cairo mit 25 Konzepte68 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.