تتيح لك الأنواع العامة كتابة كود يعمل مع أنواع متعددة دون تكرار.
عرّف الأنواع العامة باستخدام الأقواس الزاوية <T>، حيث يمثل T عنصرًا بديلًا لأي نوع.
fn largest_list<T>(l1: Array<T>, l2: Array<T>) -> Array<T> {
if l1.len() > l2.len() {
l1
} else {
l2
}
}
يشترط Cairo تحديد قيود السمات لتوضيح العمليات التي يجب أن يدعمها النوع العام.
يمكنك إضافة قيود باستخدام صيغة +:
fn process_data<T, +Drop<T>, +Copy<T>>(value: T) -> T {
// Function body
}
يمكن أن تكون البنى أيضًا عامة:
#[derive(Drop)]
struct Container<T> {
value: T,
}
يمكن أن تكون السمات عامة أيضًا، ما يسمح لها بالعمل مع أنواع مختلفة:
trait Processor<T> {
fn process(self: @T) -> ByteArray;
}
impl MyProcessor<T, +Drop<T>> of Processor<T> {
fn process(self: @T) -> ByteArray {
"processed"
}
}
يمكن للدوال أن تقبل معاملات عامة مع قيود السمات، ما يجعلها تعمل مع أي نوع ينفّذ السمة المطلوبة:
fn use_processor<T, +Processor<T>, +Drop<T>>(item: T) -> ByteArray {
item.process()
}
وظّفك المطار الجديد في برلين مطوّرًا في مختبر الروبوتات التابع له. لديهم روبوتات ثقيلة الحركة وتبدو شبه بشرية إلى حد ما، ويحاولون استخدامها لتحسين خدمة العملاء.
مهمتك الأولى في هذا العمل هي برمجة الروبوت ليحيّي الناس بلغتهم الأم بعد أن يمسحوا جوازات سفرهم على منصة تسجيل الوصول الذاتي.
الروبوت فخور بقدراته، لذا سيذكر دائمًا اللغة التي يستطيع التحدث بها أولًا، ثم يحيّي الشخص. على سبيل المثال، إذا مسح أحدهم جواز سفر ألمانيًا، فسيقول الروبوت:
I can speak German: Hallo Dietrich!
عليك أن تنظّم الكود بحيث يسهّل عليك وعلى مطوّرين آخرين إضافة لغات جديدة.
وكخطوة أولى، عرّف trait يُسمى Greeter يتضمّن دالتين:
language_name وهي تُرجع اللغة (من نوع ByteArray) التي سيستخدمها الروبوت لتحية الزائر.greet وهي تستقبل اسم الزائر (من نوع ByteArray) وتُرجع رسالة التحية بلغة محددة (من نوع ByteArray).بعد ذلك، نفّذ دالة say_hello تستقبل اسم الزائر وشيئًا ينفّذ trait المسمّى Greeter، وتُرجع التحية المطلوبة (من نوع ByteArray).
على سبيل المثال، تخيّل تطبيقًا ألمانيًا لـ trait المسمّى Greeter، حيث تُرجع language_name القيمة "German" وتُرجع greet القيمة "Hallo {name}!":
say_hello("Dietrich", germanGreeter)
// => "I can speak German: Hallo Dietrich!"
الآن اجعل الروبوت يعمل مع الأشخاص الذين يمسحون جوازات سفر إيطالية.
أنشئ struct باسم Italian، ونفّذ الدالتين لتلبية متطلبات trait المسمّى Greeter من المهمة 1.
يمكنك تحية شخص بالإيطالية بعبارة "Ciao {name}!".
قبل أن تنهي يومك، يُفترض أن تضيف إمكانية تحية الناس بالفرنسية.
أنشئ struct باسم French، ونفّذ الدالتين لتلبية متطلبات trait المسمّى Greeter.
يمكنك تحية شخص بالفرنسية بعبارة "Bonjour {name}!".
سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.