أعمار الاقتراض في Structs
الحقول المستعارة
أعمار الاقتراض في Structs درس مجاني في Learn Rust Coding على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Learn Rust Coding، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
يمكن للبنى استعارة البيانات
تملك معظم البنى بياناتها. لكن يمكن للبنية أيضًا أن تحتوي على مرجعية إلى بيانات لا تملكها. وعندئذ تحتاج البنية إلى معامل مدة عمرية.
ويضمن ذلك ألا تتجاوز البنية مدة صلاحية البيانات المستعارة.
إعلان مدة عمرية في بنية
أضف المدة العمرية بين قوسين زاويين بعد اسم البنية، ثم استخدمها مع حقل المرجعية. وهذا يعني أن البنية لا يمكن أن تتجاوز مدة صلاحية تلك المرجعية.
struct Excerpt<'a> {
text: &'a str,
}
fn main() {
let novel = String::from("Call me Ishmael. Some years ago...");
let first = novel.split('.').next().unwrap();
let e = Excerpt { text: first };
println!("{}", e.text);
}القيد الذي تضيفه
يعني التعليق أن نسخة من Excerpt لا تكون صالحة إلا ما دام النص الذي تستعيره حيًا. ويفرض المصرّف ذلك في كل موضع تُستخدم فيه البنية.
الأساليب في البنى المستعيرة
تحمل الأساليب في هذه البنية المدة العمرية أيضًا في ترويسة impl. وغالبًا يمكنك حذف المدد العمرية من جسم الأسلوب بفضل الحذف التلقائي، الذي يتناوله الدرس التالي.
struct Excerpt<'a> { text: &'a str }
impl<'a> Excerpt<'a> {
fn announce(&self) -> &str {
println!("Attention!");
self.text
}
}
fn main() {
let s = String::from("hello world");
let e = Excerpt { text: &s };
println!("{}", e.announce());
}لماذا لا نملك البيانات ببساطة؟
تُعد الملكية، باستخدام String، أبسط وغالبًا ما تكون الخيار المفضل. أما الاستعارة فتتجنب نسخ البيانات الكبيرة، وتفيد في المحللات والعروض التي تطّلع على مخازن موجودة.
لا تستخدم المدد العمرية في البنى إلا عندما تعود الاستعارة بفائدة.
مثال على عرض محلل
تُعد البنية التي تحتوي على شرائح تشير إلى نص مصدر استخدامًا كلاسيكيًا. فهي تقرأ المخزن الأصلي من دون نسخ.
struct Token<'a> {
word: &'a str,
}
fn main() {
let line = String::from("let x = 5");
let tokens: Vec<Token> = line.split_whitespace().map(|w| Token { word: w }).collect();
for t in &tokens {
println!("token: {}", t.word);
}
}حقول مراجع متعددة
يمكن للبنية أن تحتوي على مراجع متعددة. ويمكنها مشاركة مدة عمرية واحدة أو استخدام مدد عمرية مختلفة، تبعًا لعلاقة صلاحيتها بعضها ببعض.
struct Pair<'a> {
left: &'a str,
right: &'a str,
}
fn main() {
let a = String::from("foo");
let b = String::from("bar");
let p = Pair { left: &a, right: &b };
println!("{} {}", p.left, p.right);
}خطأ البنية المتدلية
إذا حُذفت البيانات المستعارة بينما لا تزال البنية موجودة، يرفض المصرّف ذلك. ومعامل المدة العمرية هو ما يجعل هذا الفحص ممكنًا.
إرجاع بنى مستعيرة
تربط الدالة التي تنشئ مثل هذه البنية مدة البنية العمرية بمُدخلها. ولا يمكن للبنية أن تتجاوز مدة صلاحية البيانات المُمررة إليها.
struct Wrap<'a> { inner: &'a str }
fn wrap<'a>(s: &'a str) -> Wrap<'a> {
Wrap { inner: s }
}
fn main() {
let text = String::from("wrapped");
let w = wrap(&text);
println!("{}", w.inner);
}المفاضلة بين الملكية والاستعارة
دليل سريع:
- هل تحتاج إلى الاحتفاظ بالبيانات بصورة مستقلة؟ امتلكها باستخدام (
StringوVec). - هل تحتاج إلى عرض قصير العمر للبيانات الموجودة؟ استعِرها باستخدام مدة عمرية.
النموذج الذهني
تشبه البنية التي تحتوي على 'a مذكرةً لاصقة مثبتة على دفتر شخص آخر: لا يكون لها معنى إلا ما دام ذلك الدفتر موجودًا. وتضمن Rust ألا تقرأ مذكرةً على دفتر اختفى.
تحقق سريع
اختبر مدى فهمك للمدد العمرية في البنى.
مراجعة
لقد تعلمت المدد العمرية في البنى:
- تحتاج البنية التي تحتوي على مرجعية إلى معامل مدة عمرية
- تربط المدة العمرية صلاحية البنية بالبيانات المستعارة
- تحمل الأساليب المدة العمرية في ترويسة
impl - فضّل الملكية ما لم تتجنب الاستعارة نسخًا مهمة
الأسئلة الشائعة
هل درس «أعمار الاقتراض في Structs» مجاني؟
نعم — نص درس «أعمار الاقتراض في Structs» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Learn Rust Coding، انتقل إلى CoddyKit PRO. تتضمن دورة Learn Rust Coding 4 دروس في المجموع.
ماذا ستتعلم في «أعمار الاقتراض في Structs»؟
الحقول المستعارة تتمرن على Learn Rust Coding مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Learn Rust Coding؟
لا تُشترط خبرة سابقة. Learn Rust Coding على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «أعمار الاقتراض في Structs»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Learn Rust Coding هذا؟
نعم. كل درس في Learn Rust Coding يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- لماذا نستخدم أعمار الاقتراض
- تعليقات أعمار الاقتراض
- أعمار الاقتراض في Structs
- قواعد الحذف