Avatar ·

لماذا يجب تحديد زمن الحياة (lifetimes) بشكل صريح في Rust وكيف تعمل؟

أنا مبتدئ في Rust وأحاول فهم مفهوم أزمنة الحياة (lifetimes). كتبت دالة بسيطة تُرجع مرجعًا إلى عنصر مصفوفة: ```rust fn get_first_element(arr: &[i32]) -> &i32 { &arr[0] } ``` قام المترجم بترجمتها دون مشاكل. ولكن عندما حاولت كتابة دالة تأخذ مرجعين وتُعيد أحدهما: ```rust fn longest(x: &str, y: &str) -> &str { if x.len() > y.len() { x } else { y } } ``` حصلت على خطأ: "missing lifetime specifier". لماذا في الحالة الأولى فهم المترجم بنفسه، بينما في الثانية يطلب تحديد lifetime بشكل صريح؟ اعتقدت أن Rust ذكي ويمكنه استنتاج كل شيء تلقائيًا. أفهم أن أزمنة الحياة ضرورية لمنع المراجع المعلقة (dangling references)، لكنني لا أفهم المنطق الذي يجعلها تُستنتج في بعض الحالات وليس في أخرى. اشرح لي، من فضلك، مع أمثلة، متى يجب تحديد lifetime بشكل صريح ومتى يمكن الاستغناء عنه. يهمني بشكل خاص لماذا في الدوال البسيطة ذات معامل واحد