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"
কিছু বিশেষ ক্যারেক্টারকে সামনে ব্যাকস্ল্যাশ দিয়ে এস্কেপ করতে হয়, যেমন স্ট্রিংয়ে ট্যাবের জন্য \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%
Exercism-এ সাইন আপ করুন, Cairo ট্র্যাকের 25টি কনসেপ্ট68টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।