Rust / دليل حلول تحريري

حل E0515: خروج مرجع إلى بيانات محلية

حدّد المالك المنتهي عند عودة الدالة واختر مخرجًا مملوكًا أو استعارة إدخال حقيقية وافهم أن معلمات العمر لا تحيي التخزين.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى

قاعدة معرفة للقراءة فقط · بلا تعليقات عامة

تعرّف على الأعراض

يبلغ E0515 عن قيمة معادة تشير لبيانات تملكها الدالة الحالية. قد تكون &str أو شريحة أو مكررًا أو كائنًا يحوي مرجعًا محليًا. يحدد التشخيص المالك أو المؤقت والإرجاع الخارج. لا ناتج تنفيذ صالحًا للبرنامج المرفوض.

لا يبقي اسم عمر أو تغيير الإرجاع إلى &'static str سلسلة محلية حية. قد تنتج العيوب المشابهة رموز أعمار أخرى في مشروع أكبر؛ استخدم المواقع كاملة ولا تصنّف كل فشل برمز واحد.

افهم الأسباب المحتملة

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

تحديد مالك العرض المعاد

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

rust تصريح أو مثال مرفوض عمدًا
fn label<'a>(id: u32) -> &'a str {
    let text = format!("item-{id}");
    &text
}
fn main() { println!("{}", label(3)); }

مرفوض عمدًا برمز E0515؛ لا تمدد المعلمات عمر text.

نقل البيانات الجديدة إلى المستدعي

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

rust مالك معاد بعمر مستقل
fn label(id: u32) -> String { format!("item-{id}") }
fn main() {
    let owned = label(3);
    println!("{owned}");
}
الناتج المتوقع
item-3

تنتمي owned إلى main بعد عودة label ولا ينكشف مرجع إلى محلي مُسقط.

استعارة بيانات يبقى مالكها فعلًا

إذا كان المطلوب جزءًا من إدخال المستدعي فاقبل &str وأعد شريحة مرتبطة دون مخزن مؤقت. تمثل Cow الاستعارة أو الملكية للنتائج الثابتة والمحولة. وتحمل البنية ذات الحقل المرجعي الاعتماد نفسه. يشترك الإغلاق المعيد لاستعارة محلية في المشكلة. لا تخف العلاقة بمؤشر خام؛ فهو يزيل الفحص ويبقي التزام التخزين غير محقق.

تحقق من نجاح الإصلاح

ترجم وشغّل المصحح فقط بالإصدار المعلن وتوقع item-3 ثم سطرًا جديدًا. أضف مستدعيًا يخزن String ويستخدمها بعد العودة ليحمي عقد الملكية لا التعبير الفوري وحده.

لواجهة مستعارة اختبر ترجمة مستهلكين بنطاقات متداخلة للتأكد من منع الخروج بعد المالك. اقرأ rustc --explain E0515 للتصنيف الرسمي. تفيد حالات الرفض ترجمة، ولا يثبت تشغيل بديل unsafe التصميم الأصلي.

امنع تكرار المشكلة

  • اختر الملكية في التوقيع قبل الجسم. أعد البيانات الجديدة مملوكة ووثّق مالك كل مرجع خارج وميّز قيد النوع static من مرجع تخزين ساكن فعلي.

المراجع الرسمية