الـ Methods العامة
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 25 من 61.
يمكن لبنية generic الاحتفاظ بأي نوع، لكنها ليست مفيدة جدًا من دون methods للتفاعل مع data الخاصة بها. لتعريف methods لبنية generic، تحتاج إلى صياغة خاصة في كتلة 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 يتكيّف مع كل نوع ملموس في وقت الترجمة.
التحدي
سهللنوسّع الحاوية generic الخاصة بك باستخدام methods! ستبني بنية Box (وهي ليست المقصودة بـ Box القياسية في Rust) يمكنها الاحتفاظ بأي نوع وتوفّر methods للتفاعل مع contents الخاصة بها.
ستنظّم شيفرتك عبر ملفين:
mybox.rs: Define بنية generic public تُسمىMyBox<T>مع field private يُسمىcontentsمن النوعT. Implement methods لهذه البنية:- دالة associated باسم
newتنشئMyBoxجديدة باستخدام القيمة given - method باسم
peekتُعيد reference إلى contents (باستخدام&self) - method باسم
replaceتستقبل قيمة جديدة وتستبدل contents current (باستخدام&mut self)
- دالة associated باسم
main.rs: أضف module الخاص بك وأظهر عمل generic methods مع أنواع مختلفة. ستنشئ صناديق، وتفحص contents الخاصة بها، وتستبدل القيم لإظهار methods أثناء العمل.
Remember صياغة syntax الأساسية لتنفيذ methods على بنية generic: تحتاج إلى impl<T> قبل MyBox<T> لإخبار Rust بأن T هو parameter generic لكتلة التنفيذ بأكملها.
في ملف main الخاص بك، أظهر استخدام MyBox من خلال:
- إنشاء صندوق باستخدام integer (input الأول، مع تحليله إلى
i32) - فحص contents الخاصة به وطباعة القيمة
- استبدال contents بـ integer جديد (input الثاني، مع تحليله إلى
i32) - فحص contents مرة أخرى لإظهار القيمة المحدّثة
- إنشاء صندوق ثانٍ باستخدام string (input الثالث)
- فحص contents الخاصة بصندوق string
يجب أن يتبع output الخاص بك هذا التنسيق:
Integer box contains: {value}
After replace: {value}
String box contains: {value}على سبيل المثال، باستخدام inputs 10 و25 وRust:
Integer box contains: 10
After replace: 25
String box contains: Rustستتلقى ثلاثة inputs: integer initial، وinteger replacement، وقيمة string.
جرّب بنفسك
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: Peek at its contents and print: "Integer box contains: {value}"
// TODO: استبدل المحتويات بالعدد الصحيح البديل
// TODO: Peek again and print: "After replace: {value}"
// TODO: أنشئ MyBox ثانيًا بقيمة السلسلة
// TODO: Peek at the string box and print: "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 عبر الإنترنت