الـ Methods العامة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 25 من 61.
يمكن للبنية العامة أن تحتوي على أي نوع، لكنها ليست مفيدة جدًا من دون طرائق للتفاعل مع بياناتها. لتعريف طرائق لبنية عامة، تحتاج إلى صياغة خاصة في كتلة impl.
المفتاح هو التصريح بالمعامل العام على impl نفسه:
struct Wrapper<T> {
value: T,
}
impl<T> Wrapper<T> {
fn get(&self) -> &T {
&self.value
}
}
لاحظ impl<T> قبل Wrapper<T>. يخبر هذا Rust بأن T معلمة نوع عامة لكتلة التنفيذ بأكملها. من دون هذا التصريح، سيبحث Rust عن نوع محدد اسمه T ولن يعثر عليه.
تعيد الطريقة get القيمة &T: مرجعًا إلى أي نوع يحتفظ به الغلاف. يعمل هذا سواء كان T عددًا صحيحًا أو سلسلة نصية أو أي نوع آخر:
let num_wrapper = Wrapper { value: 100 };
let text_wrapper = Wrapper { value: "Rust" };
println!("{}", num_wrapper.get()); // 100
println!("{}", text_wrapper.get()); // Rust
يعمل تعريف الطريقة نفسه مع كليهما، لأن النوع العام T يتكيف مع كل نوع ملموس في وقت الترجمة.
التحدي
سهللنوسّع الحاوية العامة بإضافة طرائق إليها! ستنشئ بنية Box (ولا ينبغي الخلط بينها وبين Box القياسية في Rust) يمكنها احتواء أي نوع، وتوفّر طرائق للتعامل مع محتوياتها.
ستنظّم شيفرتك في ملفين:
mybox.rs: عرّف بنية عامة مكشوفة باسمMyBox<T>تحتوي على حقل خاصcontentsمن النوعT. نفّذ طرائق لهذه البنية:- دالة مرتبطة باسم
newتنشئMyBoxجديدة بالقيمة المعطاة - طريقة باسم
peekتُعيد مرجعًا إلى المحتويات (باستخدام&self) - طريقة باسم
replaceتأخذ قيمة جديدة وتستبدل المحتويات الحالية (باستخدام&mut self)
- دالة مرتبطة باسم
main.rs: أدرج وحدتك ووضّح عمل الطرائق العامة مع أنواع مختلفة. ستنشئ صناديق، وتعاين محتوياتها، وتستبدل القيم لإظهار عمل الطرائق.
تذكّر الصياغة الأساسية لتنفيذ طرائق على بنية عامة: تحتاج إلى impl<T> قبل MyBox<T> لإخبار Rust بأن T معلمة عامة لكتلة التنفيذ بأكملها.
في ملفك الرئيسي، وضّح استخدام MyBox من خلال:
- إنشاء صندوق يحتوي على عدد صحيح (المدخل الأول، بعد تحليله كـ
i32) - معاينة محتوياته وطباعة القيمة
- استبدال محتوياته بعدد صحيح جديد (المدخل الثاني، بعد تحليله كـ
i32) - معاينته مرة أخرى لإظهار القيمة المحدّثة
- إنشاء صندوق ثانٍ يحتوي على سلسلة نصية (المدخل الثالث)
- معاينة محتويات صندوق السلسلة النصية
ينبغي أن يتبع الناتج هذا التنسيق:
Integer box contains: {value}
After replace: {value}
String box contains: {value}على سبيل المثال، مع المدخلات 10 و25 وRust:
Integer box contains: 10
After replace: 25
String box contains: Rustستتلقى ثلاثة مدخلات: عددًا صحيحًا أوليًا، وعددًا صحيحًا بديلًا، وقيمة سلسلة نصية.
جرّب بنفسك
mod mybox;
use mybox::MyBox;
fn main() {
// اقرأ المدخلات
let mut input1 = String::new();
std::io::stdin().read_line(&mut input1).expect("Failed to read line");
let initial_int: i32 = input1.trim().parse().expect("Invalid integer");
let mut input2 = String::new();
std::io::stdin().read_line(&mut input2).expect("Failed to read line");
let replacement_int: i32 = input2.trim().parse().expect("Invalid integer");
let mut input3 = String::new();
std::io::stdin().read_line(&mut input3).expect("Failed to read line");
let string_value = input3.trim().to_string();
// TODO: أنشئ MyBox بالعدد الصحيح الأولي
// TODO: اطّلع على محتوياته واطبع: "Integer box contains: {value}"
// TODO: استبدل المحتويات بالعدد الصحيح البديل
// TODO: اطّلع عليها مرة أخرى واطبع: "After replace: {value}"
// TODO: أنشئ MyBox ثانية بالقيمة النصية
// TODO: اطّلع على محتويات الصندوق النصي واطبع: "String box contains: {value}"
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت