تسلسل الأساليب
جزء من قسم البرمجة كائنية التوجه في رحلة Rust على Coddy. الدرس 6 من 61.
حتى الآن، كانت أساليب mutable الخاصة بنا تعدّل struct ولا تُرجع شيئًا. لكن ماذا لو أردنا استدعاء عدة أساليب تباعًا على النسخة نفسها؟ من خلال إرجاع مرجع إلى self، نُتيح method chaining: وهو نمط تتدفق فيه استدعاءات method متعددة معًا ضمن expression واحدة.
يكمن المفتاح في جعل أساليب &mut self لديك تُرجع &mut Self:
struct Config {
debug: bool,
timeout: u32,
}
impl Config {
fn new() -> Config {
Config { debug: false, timeout: 30 }
}
fn set_debug(&mut self, value: bool) -> &mut Self {
self.debug = value;
self
}
fn set_timeout(&mut self, seconds: u32) -> &mut Self {
self.timeout = seconds;
self
}
}
يعدّل كل method الـ struct، ثم يعيد self: وهو مرجع mutable يعود إلى المثيل نفسه. يتيح ذلك لاستدعاء method التالي مواصلة العمل عليه فورًا:
fn main() {
let mut config = Config::new();
config.set_debug(true).set_timeout(60);
println!("Debug: {}, Timeout: {}", config.debug, config.timeout);
// المخرجات: Debug: true, Timeout: 60
}
بدلًا من كتابة three عبارات منفصلة، نضبط كل شيء في سطر واحد سلس. يُعد هذا النمط «على طريقة builder» مفيدًا بشكل خاص عند إعداد كائنات تحتوي على العديد من settings الاختيارية، مما يجعل شيفرتك أكثر إيجازًا وسهولة في القراءة.
التحدي
سهلأنشئ بنية TextStyle تحتوي على ثلاثة حقول: bold (bool)، وitalic (bool)، وsize (u32).
أضف implementation block لـ TextStyle مع ما يلي:
new: associated function تُرجعTextStyleمع ضبطboldعلىfalse، وضبطitalicعلىfalse، وضبطsizeعلى12set_bold: تستقبل&mut selfوقيمةbool، وتضبط حقل bold، وتُرجع&mut Selfمن أجل chainingset_italic: تستقبل&mut selfوقيمةbool، وتضبط حقل italic، وتُرجع&mut Selfمن أجل chainingset_size: تستقبل&mut selfوقيمةu32، وتضبط حقل size، وتُرجع&mut Selfمن أجل chaining
ستتلقى three مدخلات:
- السطر الأول: إعداد bold (
trueأوfalse) - السطر الثاني: إعداد italic (
trueأوfalse) - السطر الثالث: حجم الخط (u32)
أنشئ TextStyle قابلًا للتغيير باستخدام new، ثم استخدم method chaining لتطبيق all three settings في single expression. اطبع الحالة النهائية بالـ format الموضح أدناه.
تنسيق المخرجات المتوقعة:
Bold: {bold}, Italic: {italic}, Size: {size}جرّب بنفسك
use std::io;
// TODO: عرّف الـ struct TextStyle هنا
// TODO: أضف كتلة التنفيذ لـ TextStyle مع:
// - الدالة المرتبطة new()
// - الـ method set_bold()
// - الـ method set_italic()
// - الـ method set_size()
fn main() {
let mut input = String::new();
// اقرأ إعداد bold
io::stdin().read_line(&mut input).expect("Failed to read line");
let bold: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// اقرأ إعداد italic
io::stdin().read_line(&mut input).expect("Failed to read line");
let italic: bool = input.trim().parse().expect("Invalid bool");
input.clear();
// اقرأ إعداد size
io::stdin().read_line(&mut input).expect("Failed to read line");
let size: u32 = input.trim().parse().expect("Invalid u32");
// TODO: أنشئ TextStyle قابلاً للتعديل باستخدام new()، ثم استخدم method chaining
// لتطبيق الإعدادات الثلاثة جميعها في تعبير واحد
// TODO: اطبع النتيجة بالتنسيق: Bold: {bold}, Italic: {italic}, Size: {size}
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس البرمجة كائنية التوجه
1الأساليب والسلوك
مقدمة في كتل التنفيذمعامل Selfالأساليب القابلة للتعديلالدوال المرتبطةكتل تنفيذ متعددةتسلسل الأساليبمراجعة - إجراءات المستطيل4مشروع: حيوان أليف افتراضي
تعريف الحيوان الأليفإطعام الحيوان الأليف2التغليف والوحدات البرمجية
أساسيات الوحدات البرمجيةالكلمة المفتاحية Publicالحقول الخاصةدوال Gettersدوال Settersمراجعة - الخزانة الآمنة5الأنواع العامة (Generics)
الـ Structs العامةالـ Methods العامةأنواع عامة متعددةالـ Functions العامةمراجعة - Coordinate Point3التعدادات المتقدمة (Advanced Enums)
التعدادات مع البياناتالأساليب (Methods) في التعداداتمطابقة حالات البياناتمراجعة التعداد Optionملخص - التعداد Shape6تعريف الـ Traits
ما هي الـ Trait؟تنفيذ الـ Traitsالتنفيذات الافتراضيةتجاوز التنفيذات الافتراضيةالـ Traits مع المعاملاتملخص - مشغل الوسائطتدرّب بنفسك: مترجم Rust عبر الإنترنت