لا يمتلك 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.