Cairo hat keinen nativen Typ für Zeichenketten, bietet aber zwei Möglichkeiten, mit ihnen umzugehen: kurze Zeichenketten mit einfachen Anführungszeichen und ByteArray mit doppelten Anführungszeichen.
Eine kurze Zeichenkette ist eine ASCII-Zeichenkette, bei der jedes Zeichen mit einem Byte kodiert wird.
Der Typ, den Cairo standardmäßig für kurze Zeichenketten verwendet, ist felt252, wodurch ihre maximale Länge nur 31 Zeichen beträgt.
// below are different ways to write the same value
let name: felt252 = 'Jane'; // short string format
let name: felt252 = 0x4a616e65; // byte format
let name: felt252 = 1247899237; // decimal format
Technisch gesehen kann jeder Ganzzahltyp, der kleiner als felt252 ist, im Format für kurze Zeichenketten dargestellt werden.
// all of the below are equal u8 values, they are just written using different formats!
let lowercase_a_in_ascii: u8 = 'a'; // short string format
let lowercase_a_in_ascii: u8 = 0x61; // byte format
let lowercase_a_in_ascii: u8 = 97; // decimal format
Für Zeichenketten, die länger als 31 Zeichen sind, stellt Cairo ByteArray bereit, das eine unbegrenzte Länge hat.
let long_string: ByteArray = "this is a string which has more than 31 characters";
ByteArrays können mit dem +-Operator verkettet werden:
"Jane" + " " + "Austen"
// => "Jane Austen"
Einige Sonderzeichen müssen mit einem vorangestellten Backslash maskiert werden, wie \t für einen Tabulator und \n für einen Zeilenumbruch in Zeichenketten.
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
Sogar auf einzelne Bytes innerhalb eines ByteArrays kannst du über dessen Index zugreifen.
Sei aber vorsichtig: Der Typ des zurückgegebenen Bytes ist u8 und nicht ByteArray!
let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33
Die Kernbibliothek bietet viele nützliche Methoden und Operatoren, um mit ByteArrays zu arbeiten.
Für weitere Informationen zu ByteArray-Methoden schau dir die ByteArrayTrait-Dokumentation an.
Hier sind einige Beispiele:
let name: felt252 = 'Jane';
let mut greeting: ByteArray = "Welcome ";
// append_word appends a single word of a given number of bytes to the end of the ByteArray
greeting.append_word(name, 4);
// => "Welcome Jane"
// rev returns a ByteArray with the all characters reversed
let rev_greeting = greeting.rev();
// => "enaJ emocleW"
In der Nähe gibt es einen Laden namens „Tech Palace“. Der Inhaber des Ladens hat vor Kurzem ein großes Display installiert, um damit Werbebotschaften anzuzeigen und um Kunden, die am Eingang ihre Kundenkarte scannen, einen besonderen Gruß zu zeigen. Das Display besteht aus vielen kleinen LED-Leuchten und kann mehrere Textzeilen anzeigen.
Der Inhaber braucht deine Hilfe bei dem Code, mit dem der Text für das neue Display erzeugt wird.
Für die meisten Kunden, die ihre Kundenkarte scannen, möchte der Inhaber auf dem Display Welcome to the Tech Palace, gefolgt vom Namen des Kunden in Großbuchstaben sehen.
Implementiere die Funktion welcome_message, die den Namen des Kunden als kurzen String (felt252) entgegennimmt und die gewünschte Nachricht als ByteArray zurückgibt.
welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY
Für treue Kunden, die viel im Laden kaufen, möchte der Inhaber die Willkommensanzeige aufhübschen, indem er vor und nach der Willkommensnachricht eine Zeile mit Sternen hinzufügt. Er ist sich noch nicht sicher, wie viele Sterne in den Zeilen stehen sollen, also möchte er das konfigurierbar machen.
Schreibe eine Funktion add_border, die eine Willkommensnachricht (ein ByteArray) und die Anzahl der Sterne pro Zeile (Typ u32) als Argumente entgegennimmt.
Sie soll ein ByteArray zurückgeben, das aus 3 Zeilen besteht: eine Zeile mit der gewünschten Anzahl Sterne, dann die Willkommensnachricht so, wie sie übergeben wurde, und dann noch eine Zeile mit Sternen.
add_border("Welcome!", 10)
Sollte Folgendes zurückgeben:
**********
Welcome!
**********
Bevor dieses neue Display installiert wurde, hatte der Laden ein ähnliches Display, das nur nicht konfigurierbare, statische Zeilen anzeigen konnte. Der Inhaber möchte einige der alten Werbebotschaften auf dem neuen Display weiterverwenden. Allerdings enthalten die Daten bereits einen Sternenrahmen und einige unglückliche Leerzeichen. Deine Aufgabe ist es, die Nachrichten aufzuräumen, damit sie weiterverwendet werden können.
Implementiere eine Funktion clean_up_message, die die alte Werbebotschaft als ByteArray entgegennimmt.
Die Funktion soll zuerst alle Sterne aus dem Text entfernen und danach die führenden und abschließenden Leerzeichen aus dem verbleibenden Text entfernen.
Anschließend soll die Funktion die aufgeräumte Nachricht zurückgeben.
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%
Melde dich bei Exercism an, um Cairo mit 25 Konzepte68 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.