يستخدم Rust مدقق استعارة لفرض قواعد الملكية الخاصة به والتأكد من أن البرامج آمنة للذاكرة. تحدد قواعد الملكية كيفية إدارة Rust للذاكرة عبر المكدس والكومة.

أثناء كتابة برامج Rust ، ستحتاج إلى استخدام المتغيرات دون تغيير ملكية القيمة المرتبطة. يوفر Rust آلية استعارة قوية لتشجيع المرونة وإعادة استخدام الكود.

ما هو الاقتراض في الصدأ؟

الاقتراض هو الوصول إلى قيمة متغير بدون أخذ ملكية المتغير من خلال الرجوع إلى المالك. يضمن مدقق الاستعارة أن المرجع صالح ، ولا يتم إسقاط البيانات باستخدام بنية تسمى lifetimes.

العمر هو مدة وجود المتغير. تبدأ الأعمار في الخلق المتغير وتنتهي عند التدمير المتغير. يمكنك استعارة ملكية متغير ، وعندما يكون المرجع المقترض خارج النطاق ، تعود الملكية إلى متغير المالك. الاقتراض يشبه إلى حد ما ملف المؤشرات التي ستجدها بلغات مثل C ++ و Go. لكن مترجم Rust يستخدم مدقق الاستعارة للتأكد من أن البرامج آمنة للذاكرة.

مثال على الاقتراض في الصدأ

يمكنك استعارة ملكية المتغير عن طريق الرجوع إلى المالك باستخدام رمز العطف (&).

الجبهة الوطنيةرئيسي() {
يترك س = سلسلة:: من ("مرحبًا") ؛ // x يمتلك "hello"
يترك ص = & س ؛ // y المراجع x ، تقترض "hello"
println!("{}" ، خ) ؛
println!("{}" ، ص)
}
instagram viewer

بدون الاقتراض من خلال الإحالة ، سيصاب البرنامج بالذعر. قد ينتهك قاعدة الملكية أن القيمة يمكن أن يكون لها مالك واحد ، ولا يمكن لمتغيرين أن يشيران إلى نفس موقع الذاكرة. يمكن أن يكون الاقتراض مفيدًا جدًا في الوظائف. فيما يلي مثال على استعارة دالة ، للاحتفاظ بالملكية أثناء استدعاء وظائف أخرى تأخذ المتغيرات المحلية كوسيطات.

الجبهة الوطنيةprint_even(vectr: &Vec<i32>) {
إلى عن على القيم في فكتور {
إذا القيم ٪ 2 == 0 {
println!("{}"، القيم)؛
}
}
}

ال print_even تشير الدالة إلى متجه من أعداد صحيحة 32 بت كوسيطة لها. ثم يقوم بطباعة سطور من القيم التي تكون مضاعفات الرقمين في المتجه باستخدام حلقة for-loop و println! دقيق.

الجبهة الوطنيةرئيسي() {
يترك number_vector = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even (& number_vector) ؛ // الملكية مستعارة وليست منقولة
println!("تحتفظ الوظيفة الرئيسية بملكية متجه الأرقام {:؟}" ، number_vector)
}

تقوم الوظيفة الرئيسية بتعريف المتغير number_vector وتخصيص متجه من الأعداد الصحيحة 32 بت له. ثم يستدعي الدالة print_even ويمررها كمرجع إلى ملف number_vector متغير باستخدام رمز علامة العطف.

الوظيفة الرئيسية تحتفظ بملكية number_vector متغير يمكنه الاستمرار في استخدام القيمة في موقع الذاكرة الخاص به.

الاقتراض والتحول المراجع

يمكن للوظائف أيضًا تعديل المتغيرات المستعارة باستخدام مراجع قابلة للتغيير إليها قبل إعادة الملكية.

ومع ذلك ، على عكس المتغيرات العادية التي يمكن ضبطها على متغير باستخدام الكلمة الأساسية mut ، يجب أن تسبق المراجع القابلة للتغيير برمز علامة العطف.

قبل عمل مراجع قابلة للتغيير ، يجب أن يكون المتغير الذي ترغب في تعديله قابلاً للتغيير.

الجبهة الوطنيةremove_value(vectr: &موتVec<i32>) -> &Vec<i32> {
vectr.remove (4);
إرجاع فكتور
}

ال remove_value تأخذ الدالة في الإشارة إلى متجه متغير لأعداد صحيحة 32 بت. تقوم بإرجاع متجه من الأعداد الصحيحة 32 بت بعد إزالة قيمة المتجه في الفهرس الرابع.

الجبهة الوطنيةرئيسي() {
يتركموت الأعداد = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
remove_value (&موت الأعداد) ؛ // إشارة قابلة للتغيير هنا
println!("{:؟}" ، أرقام) ؛
}

تقوم الوظيفة بتعديل ملف الأعداد المتجه عن طريق استدعاء remove_value وتمرير المرجع القابل للتغيير للمتجه كوسيطة. عند طباعة المتجه ، لا يوجد الفهرس الرابع السابق للمتجه.

لاحظ أن الحجة هي إشارة إلى متجه قابل للتغيير.

من المهم فهم الملكية والاقتراض

ستحتاج إلى فهم الملكية والاقتراض لكتابة كود Rust فعال وآمن للذاكرة يقوم بالتجميع والتشغيل. إذا كانت التعليمات البرمجية الخاصة بك لا تتبع قواعد الملكية ، فسيقوم مدقق الاستعارة باكتشافها. ستحتاج إلى جعل برنامجك آمنًا على الذاكرة ليقوم Rust بتجميعه.

مدقق الاقتراض مزعج عندما تكون جديدًا في Rust. ولكن ، عندما تكتب المزيد من كود Rust ، ستعتاد عليه وتكتسب خبرة في كتابة كود Rust الآمن للذاكرة.