Cairo نوع بومیای برای رشتهها ندارد، اما دو راه برای کار با آنها در اختیار میگذارد: رشتههای کوتاه با کوتیشنهای ساده و ByteArray با کوتیشنهای دوگانه.
یک رشتهی کوتاه، رشتهای ASCII است که هر کاراکترش روی یک بایت کدگذاری میشود.
نوعی که Cairo بهطور پیشفرض برای رشتههای کوتاه استفاده میکند felt252 است و همین باعث میشود حداکثر طول آنها فقط ۳۱ کاراکتر باشد.
// 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
برای رشتههای بلندتر از ۳۱ کاراکتر، Cairo نوع ByteArray را فراهم میکند که طولی نامحدود دارد.
let long_string: ByteArray = "this is a string which has more than 31 characters";
ByteArrayها را میتوان با عملگر + به هم چسباند:
"Jane" + " " + "Austen"
// => "Jane Austen"
بعضی کاراکترهای خاص باید با یک بکاسلش در ابتدا escape شوند؛ مثل \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 برگرداند که از ۳ خط تشکیل شده است: یک خط با تعداد ستارههای موردنظر، سپس پیام خوشآمد همانطور که ورودی بوده، و سپس یک خط ستارهی دیگر.
add_border("Welcome!", 10)
باید خروجی زیر را برگرداند:
**********
Welcome!
**********
پیش از نصب این نمایشگر جدید، فروشگاه یک نمایشگر مشابه داشت که فقط میتوانست خطهای ثابت و غیرقابلتنظیم را نشان دهد. صاحب فروشگاه میخواهد برخی از پیامهای تبلیغاتی قدیمی را روی نمایشگر جدید دوباره استفاده کند. اما دادهها از قبل شامل یک حاشیهی ستارهای و چند فاصلهی ناخواسته است. وظیفهی شما این است که پیامها را پاکسازی کنید تا بتوان دوباره از آنها استفاده کرد.
تابع clean_up_message را پیادهسازی کنید که پیام تبلیغاتی قدیمی را بهعنوان یک ByteArray میپذیرد.
این تابع باید ابتدا همهی ستارهها را از متن حذف کند و سپس فاصلههای ابتدا و انتهای متن باقیمانده را حذف کند.
سپس تابع باید پیام پاکسازیشده را برگرداند.
let message: ByteArray = "
**************************
* BUY NOW, SAVE 10% *
**************************
";
clean_up_message(message)
// => BUY NOW, SAVE 10%