Το Cairo δεν έχει εγγενή τύπο για συμβολοσειρές, αλλά παρέχει δύο τρόπους για να τις χειριστείς: σύντομες συμβολοσειρές με απλά εισαγωγικά και ByteArray με διπλά εισαγωγικά.
Μια σύντομη συμβολοσειρά είναι μια συμβολοσειρά ASCII όπου κάθε χαρακτήρας κωδικοποιείται σε ένα byte.
Ο τύπος που χρησιμοποιεί το Cairo για τις σύντομες συμβολοσειρές από προεπιλογή είναι ο felt252, με μέγιστο μήκος μόλις 31 χαρακτήρες.
// 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
Τεχνικά, οποιοσδήποτε ακέραιος τύπος μικρότερος από felt252 μπορεί να αναπαρασταθεί χρησιμοποιώντας τη μορφή σύντομης συμβολοσειράς.
// 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
Για συμβολοσειρές μεγαλύτερες από 31 χαρακτήρες, το Cairo παρέχει το ByteArray, που έχει απεριόριστο μήκος.
let long_string: ByteArray = "this is a string which has more than 31 characters";
Τα ByteArray μπορούν να συνενωθούν μέσω του τελεστή +:
"Jane" + " " + "Austen"
// => "Jane Austen"
Κάποιοι ειδικοί χαρακτήρες χρειάζονται διαφυγή με μια ανάστροφη κάθετο μπροστά, όπως \t για ένα tab και \n για μια νέα γραμμή μέσα σε συμβολοσειρές.
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
Μπορείς μάλιστα να προσπελάσεις μεμονωμένα byte μέσα σε ένα ByteArray χρησιμοποιώντας τη θέση του.
Πρόσεξε όμως, ο τύπος του byte που επιστρέφεται είναι u8 και όχι ByteArray!
let hello: ByteArray = "Hello World!";
let exclamation_mark: u8 = hello[11];
// => 33
Η βασική βιβλιοθήκη παρέχει πολλές χρήσιμες μεθόδους και τελεστές για να δουλεύεις με ByteArray.
Για περισσότερες πληροφορίες σχετικά με τις μεθόδους του ByteArray, δες την τεκμηρίωση του ByteArrayTrait.
Ορίστε μερικά παραδείγματα:
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"
Κοντά σου υπάρχει ένα κατάστημα ηλεκτρικών ειδών που λέγεται "Tech Palace". Ο ιδιοκτήτης του καταστήματος εγκατέστησε πρόσφατα μια μεγάλη οθόνη, για να προβάλλει διαφημιστικά μηνύματα και να δείχνει έναν ξεχωριστό χαιρετισμό όταν οι πελάτες σκανάρουν τις κάρτες πιστότητάς τους στην είσοδο. Η οθόνη αποτελείται από πολλά μικρά φωτάκια LED και μπορεί να δείξει πολλές γραμμές κειμένου.
Ο ιδιοκτήτης του καταστήματος χρειάζεται τη βοήθειά σου με τον κώδικα που χρησιμοποιείται για να δημιουργεί το κείμενο της νέας οθόνης.
Για τους περισσότερους πελάτες που σκανάρουν τις κάρτες πιστότητάς τους, ο ιδιοκτήτης θέλει να βλέπει στην οθόνη το Welcome to the Tech Palace, ακολουθούμενο από το όνομα του πελάτη με κεφαλαία γράμματα.
Υλοποίησε τη συνάρτηση welcome_message που δέχεται το όνομα του πελάτη ως όρισμα σύντομης συμβολοσειράς (felt252) και επιστρέφει το επιθυμητό μήνυμα ως ByteArray.
welcome_message("Judy")
// => Welcome to the Tech Palace, JUDY
Για τους πιστούς πελάτες που αγοράζουν πολλά από το κατάστημα, ο ιδιοκτήτης θέλει η οθόνη υποδοχής να γίνει πιο φανταχτερή, προσθέτοντας μια γραμμή από αστέρια πριν και μετά το μήνυμα υποδοχής. Δεν είναι ακόμη σίγουρος πόσα αστέρια πρέπει να έχει κάθε γραμμή, γι' αυτό θέλει να μπορεί να το ρυθμίζει.
Γράψε μια συνάρτηση add_border που δέχεται ως ορίσματα ένα μήνυμα υποδοχής (ένα ByteArray) και τον αριθμό των αστεριών ανά γραμμή (τύπου u32).
Θα πρέπει να επιστρέφει ένα ByteArray που αποτελείται από 3 γραμμές: μια γραμμή με τον επιθυμητό αριθμό αστεριών, μετά το μήνυμα υποδοχής όπως ακριβώς δόθηκε, και μετά άλλη μια γραμμή αστεριών.
add_border("Welcome!", 10)
Θα πρέπει να επιστρέψει το εξής:
**********
Welcome!
**********
Πριν εγκαταστήσει αυτή τη νέα οθόνη, το κατάστημα είχε μια παρόμοια οθόνη που μπορούσε να δείχνει μόνο σταθερές γραμμές, χωρίς δυνατότητα ρύθμισης. Ο ιδιοκτήτης θα ήθελε να ξαναχρησιμοποιήσει μερικά από τα παλιά διαφημιστικά μηνύματα στη νέα οθόνη. Ωστόσο, τα δεδομένα περιλαμβάνουν ήδη ένα περίγραμμα από αστέρια και κάποια άτυχα κενά. Η δουλειά σου είναι να καθαρίσεις τα μηνύματα ώστε να μπορούν να ξαναχρησιμοποιηθούν.
Υλοποίησε μια συνάρτηση clean_up_message που δέχεται το παλιό διαφημιστικό μήνυμα ως ByteArray.
Η συνάρτηση θα πρέπει πρώτα να αφαιρεί όλα τα αστέρια από το κείμενο και στη συνέχεια να αφαιρεί τα κενά στην αρχή και στο τέλος του κειμένου που απομένει.
Στη συνέχεια, η συνάρτηση θα πρέπει να επιστρέφει το καθαρισμένο μήνυμα.
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Cairo με 25 έννοιες68 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.