Cairo में स्ट्रिंग के लिए कोई मूल डेटा टाइप नहीं है, लेकिन स्ट्रिंग संभालने के दो तरीके हैं: साधारण कोट्स से लिखी छोटी स्ट्रिंग और डबल कोट्स से लिखा ByteArray।
छोटी स्ट्रिंग एक ASCII स्ट्रिंग होती है, जिसमें हर अक्षर एक बाइट में एन्कोड किया जाता है।
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 और नई लाइन के लिए \n।
"How is the weather today?\nIt's sunny"
// =>
// How is the weather today?
// It's sunny
आप किसी ByteArray के अंदर मौजूद अलग-अलग बाइट तक उसके इंडेक्स की मदद से पहुँच भी सकते हैं।
लेकिन ध्यान रखिए, जो बाइट लौटता है उसका टाइप 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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।