জেনেরিক (generics) দিয়ে আপনি একই কোড দিয়ে একাধিক টাইপের কাজ করতে পারেন, কোনো কিছু ডুপ্লিকেট না করেই। অ্যাঙ্গেল ব্র্যাকেট <T> ব্যবহার করে জেনেরিক টাইপ ডিফাইন করা যায়, যেখানে T যেকোনো টাইপের জন্য একটি প্লেসহোল্ডার।
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
জেনেরিক টাইপটি কোন কোন অপারেশন সমর্থন করবে তা নির্দিষ্ট করার জন্য Cairo-এ trait bound দিতে হয়। + সিনট্যাক্স ব্যবহার করে আপনি সীমাবদ্ধতা যোগ করতে পারেন:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
struct-ও জেনেরিক হতে পারে:
#[derive(Drop)]
struct Container<T> {
value: T,
}
trait-ও জেনেরিক হতে পারে, ফলে সেগুলো বিভিন্ন টাইপের সাথে কাজ করতে পারে:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
ফাংশন trait bound-সহ জেনেরিক প্যারামিটার নিতে পারে, ফলে প্রয়োজনীয় trait ইমপ্লিমেন্ট করে এমন যেকোনো টাইপের সাথে সেগুলো কাজ করে:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
বার্লিনের নতুন বিমানবন্দর তাদের রোবট ল্যাবের জন্য ডেভেলপার হিসেবে আপনাকে নিয়োগ দিয়েছে। তাদের কিছু আনাড়ি, অনেকটা মানুষসদৃশ দেখতে রোবট আছে, যেগুলো দিয়ে তারা গ্রাহকসেবার মান উন্নত করার চেষ্টা করছে।
চাকরির প্রথম কাজ হলো, সেলফ-চেক-ইন কাউন্টারে মানুষ তাদের পাসপোর্ট স্ক্যান করার পর তাদের মাতৃভাষায় তাদের অভিবাদন জানানোর জন্য রোবটটিকে প্রোগ্রাম করা।
রোবটটি তার দক্ষতা নিয়ে গর্বিত, তাই রোবটটি সর্বদা আগে বলে যে সে কোন ভাষায় কথা বলতে পারে, তারপর ব্যক্তিকে অভিবাদন জানায়। উদাহরণস্বরূপ, কেউ যদি জার্মান পাসপোর্ট স্ক্যান করে, রোবটটি বলবে:
I can speak German: Hallo Dietrich!
আপনি এবং অন্য ডেভেলপাররা যাতে সহজেই নতুন ভাষা যোগ করতে পারেন, সেভাবে আপনার কোড সাজাতে হবে।
প্রথম ধাপ হিসেবে, দুটি ফাংশনসহ একটি Greeter ট্রেইট ডিফাইন করুন।
language_name, যা সেই ভাষা (একটি ByteArray) রিটার্ন করে, যা দিয়ে রোবটটি ভিজিটরের অভিবাদন জানাবে।greet, যা ভিজিটরের নাম (একটি ByteArray) নেয় এবং নির্দিষ্ট একটি ভাষায় অভিবাদনের বার্তা (একটি ByteArray) রিটার্ন করে।এরপর, একটি ফাংশন say_hello ইমপ্লিমেন্ট করুন, যা ভিজিটরের নাম এবং Greeter ট্রেইট ইমপ্লিমেন্ট করে এমন কিছু একটা নেয় এবং কাঙ্ক্ষিত অভিবাদন (একটি ByteArray) রিটার্ন করে। উদাহরণস্বরূপ, একটি জার্মান Greeter ইমপ্লিমেন্টেশন কল্পনা করুন, যার language_name রিটার্ন করে "German" এবং greet রিটার্ন করে "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
এখন ইতালীয় পাসপোর্ট স্ক্যান করা মানুষদের জন্য রোবটটিকে কাজ করান।
একটি স্ট্রাক্ট Italian তৈরি করুন এবং টাস্ক ১-এর Greeter ট্রেইট পূরণ করার জন্য দুটি ফাংশন ইমপ্লিমেন্ট করুন। আপনি ইতালীয়তে কাউকে "Ciao {name}!" দিয়ে অভিবাদন জানাতে পারেন।
দিনের কাজ শেষ করার আগে, ফরাসিতে মানুষকে অভিবাদন জানানোর সুবিধাটি যোগ করার কথা আপনার।
একটি স্ট্রাক্ট French তৈরি করুন এবং Greeter ট্রেইট পূরণ করার জন্য দুটি ফাংশন ইমপ্লিমেন্ট করুন। আপনি ফরাসিতে কাউকে "Bonjour {name}!" দিয়ে অভিবাদন জানাতে পারেন।
Exercism-এ সাইন আপ করুন, Cairo ট্র্যাকের 25টি কনসেপ্ট68টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।