سيساعد التعرف على هذين المفهومين في تعزيز فهمك لكيفية عمل Rust وكيف يمكنك تنفيذ ميزات OOP.
تعتبر السمات ومدة الحياة من المكونات الرئيسية للصدأ. يمكنك استخدام السمات لتحديد السلوكيات والإمكانيات للأنواع التي يجب تنفيذها. إنها متعددة الاستخدامات للغاية ، مما يسمح لك بكتابة المزيد من التعليمات البرمجية العامة وتقليل التكرار وتحسين إمكانية الصيانة.
يستخدم Rust آلية أخرى - مدى الحياة - لتتبع ملكية المتغيرات داخل وخارج النطاق. هذا يمنع المؤشرات المتدلية أثناء إلغاء التخصيص المتغير.
تساعد السمات ومدة الحياة معًا في ضمان أمان الكتابة وأمان الذاكرة وموثوقية الكود.
فهم السمات في الصدأ
السمات هي مجموعات من الأساليب التي يمكن للأنواع الأخرى تنفيذها. السمات تشبه واجهات بلغات مثل Javaو Go و TypeScript ولكنها أكثر مرونة.
ستستخدم ملف سمة كلمة مفتاحية لتعريف السمات في Rust ، متبوعة بإعلان عن تواقيع الأسلوب.
سمةMyTrait {
الجبهة الوطنيةطريقي(&الذات);
}
يحدد الكود سمة مسماة MyTrait مع طريقي طريقة. ال &الذات تشير المعلمة إلى أن الطريقة تشير إلى كائن من نوع التنفيذ كمعامله الأول.
بعد تحديد سمة ، يمكنك تنفيذها لأنواعك المخصصة.
إليك كيفية تنفيذ سمة لأنواع الهياكل الخاصة بك.
هيكلشخص {
اسم: خيط,
عمر: u32,
}
ضمني معلومات ل شخص {
الجبهة الوطنيةملخص(&الذات) {
println!("اسمي {} وعمري {} عام.", الذات.اسم، الذات.عمر)؛
}
}
ال شخص أدوات الهيكل معلومات، ويمكنك الاتصال بـ ملخص طريقة على حالات شخص هيكل.
الجبهة الوطنيةرئيسي(){
يترك john = الشخص {الاسم: خيط::من("جون")، عمر: 30 };
john.summary () ، // الإخراج: اسمي جون وعمري 30 عامًا.
}
ال جون المتغير هو مثيل لـ شخص هيكل.
ال رئيسي المكالمات الوظيفية ملخص الذي يطبع رسالة إلى وحدة التحكم:
يمكن أن تنفذ Enums السمات. إليك كيفية تحديد التعداد باستخدام المتغيرات التي تنفذ ملخص طريقة:
تعدادMyEnum {
VariantA ،
المتغير ب ،
}
ضمني معلومات ل MyEnum {
الجبهة الوطنيةملخص(&الذات) {
مباراةالذات {
MyEnum:: VariantA => {
// تنفيذ VariantA
}
MyEnum:: VariantB => {
// تنفيذ VariantB
}
}
}
}
استخدام السمات لمعلمات الوظيفة وقيم الإرجاع
يمكنك استخدام السمات كمعلمات دالة وقيم إرجاع. يعد استخدام السمات كمعلمات دالة مفيدًا لكتابة رمز عام بأنواع متعددة.
فيما يلي وظيفة تأخذ معلمة من أي نوع يتم تنفيذها معلومات.
الجبهة الوطنيةقم بعمل ما(القيمة: T) {
value.summary () ؛
}
ال النحو يحدد ذلك تي يجب أن تنفذ معلومات. يمكنك استدعاء ملخص تعمل بأي قيمة تنفذ معلومات.
العمر في الصدأ
تعمل أداة مدقق استعارة Rust على تحليل البرامج وتضمن الاستخدام المناسب للذاكرة. في الصدأ كل قيمة لها مالك هذا مسؤول عن توزيع القيمة. متى المتغيرات تقترض القيم، يقترضون إشارة إلى القيمة التي تم تمريرها ، لكن المالك يحتفظ بالملكية.
تعد مدة الحياة طريقة للتأكد من استخدام القيم المستعارة بشكل صحيح. العمر عبارة عن تسمية مرفقة بمرجع ، تصف مدة صلاحية المرجع.
في Rust ، يمكنك تحديد عمر باستخدام تعليق توضيحي بعلامة اقتباس أحادية:
func <'أ>
عند إنشاء مرجع ، يتم تعيين عمر المرجع الذي يصف مدة صلاحيته. إذا كانت لديك دالة تأخذ المرجع إلى قيمة ، فيجب أن يكون عمرها أطول من استدعاء الدالة للتأكد من أن القيمة صالحة عند إرجاع الدالة.
فيما يلي مثال لمواصفات مدى الحياة في إحدى الوظائف.
الجبهة الوطنيةقم بعمل ما<'أ> (س: &'أi32) -> &'أi32 {
x
}
الجبهة الوطنيةرئيسي() {
يترك س = 42;
يترك النتيجة = do_something (& x) ؛
println!("النتيجه هي: {}"، نتيجة)؛
}
في ال قم بعمل ما وظيفة 'أ تشير المعلمة مدى الحياة إلى أن المرجع إلى x صالح طالما أن استدعاء الوظيفة. المرجع الذي تم إرجاعه صالح أيضًا طالما أن استدعاء الوظيفة.
ال رئيسي تقوم الوظيفة بطباعة النتيجة بتمرير مرجع إلى x متغير في رئيسي وظيفة إلى وحدة التحكم.
يمكن أن تكون صيغة العمر مطولة ، لكنها ضرورية لإدارة السلامة والذاكرة. توفر قواعد الشطب الممتدة لثلاث سنوات إرشادات تسمح لـ Rust باستنتاج عمر المراجع في مواقف معينة.
قاعدة عمر الإدخال
تحدد قاعدة عمر الإدخال أنه إذا كانت دالة أو طريقة تأخذ مرجعًا واحدًا أو أكثر كمعلمات إدخال ، يفترض Rust أن جميع المراجع لها نفس العمر.
ببساطة ، سيكون عمر مراجع المخرجات هو نفس عمر مراجع الإدخال.
الجبهة الوطنيةأطول<'أ> (س: &'أشارع، ص: &'أشارع) -> &'أشارع {
لو x.len ()> y.len () {x} آخر {ص}
}
في ال أطول وظيفة ، يستنتج Rust أن عمر مرجع الإخراج هو نفسه مرجع الإدخال لأن كلاهما لهما نفس معلمة العمر 'أ.
تسهل قاعدة عمر الإدخال كتابة الدالات العامة التي تأخذ عدة مراجع كمدخلات.
قاعدة عمر الإخراج
تحدد قاعدة عمر الإخراج أنه إذا قامت دالة أو طريقة بإرجاع مرجع ، فسيفترض Rust أن عمر مرجع الإخراج يختلف عن عمر أي مرجع إدخال.
الجبهة الوطنيةأول كلمة<'أ> (ق: &'أشارع) -> &'أشارع {
s.split_whitespace (). next (). unsrap ()
}
في هذه الوظيفة ، يستنتج Rust أن عمر مرجع الإخراج يختلف عن عمر مرجع الإدخال لأن تقسيم_مسافة بيضاء () الطريقة تنشئ مرجع إخراج لا يأخذ معلمات مرجعية للإدخال.
Elision of Lifetimes Rule. شطب حكم العمر
يتم تطبيق قاعدة elision of lifetimes إذا كانت دالة أو طريقة تأخذ مرجعًا أو معلمة إدخال واحدة وتقوم بإرجاع مرجع. في هذه الحالة ، يفترض Rust أن مرجع الإخراج له نفس عمر مرجع الإدخال.
الجبهة الوطنيةأطول<'أ> (س: &'أشارع، ص: &شارع) -> &'أشارع {
لو x.len ()> y.len () {x} آخر {ص}
}
في هذه الوظيفة ، يستنتج Rust أن عمر مرجع الإخراج هو نفس عمر مرجع الإدخال لأن مرجع الإدخال ذ ليس له معلمة مدى الحياة. Rust يلغي معلمة مدى الحياة لـ ذ ويفترض أن له نفس عمر x.
تسهل هذه القاعدة كتابة الوظائف التي تأخذ مرجع إدخال واحد وتعيد مرجع إخراج واحد.
السمات ومدى الحياة
يمكنك الجمع بين السمات وأعمار الحياة لإنشاء وظائف عامة تعمل للأنواع التي تنفذ سمة ولها عمر صالح.
إليك سمة ودالة تشير إلى قيمة تنفذ هذه السمة.
سمةإلى سلسلة {
الجبهة الوطنيةإلى سلسلة(&الذات) -> خيط;
}
الجبهة الوطنيةإلى سلسلة<'أ، تي: إلى سلسلة> (ر: &'أ T) -> خيط {
t.to_string ()
}
هنا ، معلمة العمر 'أ يضمن أن المرجع ر صالح طوال عمر الكائن الذي يشير إليه. يمكنك استخدام ال إلى سلسلة تعمل مع الأنواع التي تنفذ إلى سلسلة سمة لها عمر صالح.
تشكل السمات أساس تنفيذ مفاهيم OOP في الصدأ
تمكّنك السمات من تحديد السلوكيات. على الرغم من أن Rust ليست لغة برمجة موجهة للكائنات (OOP) ، يمكنك استخدام السمات لتنفيذ مفاهيم OOP من التغليف إلى الوراثة وتعدد الأشكال والتجريد.
يؤدي تطبيق مفاهيم OOP هذه بسمات إلى جعل برامج Rust قابلة للتطوير وقوية وقابلة للصيانة وفعالة.