Avatar ·

ما هي القواعد الدقيقة للإلغاء التلقائي للمراجع (auto-dereferencing) في Rust؟

مرحباً بالجميع! بدأت تعلم Rust مؤخراً وأشعر بالارتباك حول متى وكيف يقوم المترجم تلقائياً بإلغاء المراجع. على سبيل المثال، أرى أنه يمكن استدعاء الدالة `len()` على `&String`، رغم أن `len()` معرفة لـ `String`. أو يمكن تمرير `&i32` إلى دالة تتوقع `i32`، وهل سيقوم Rust بإلغاء مرجعها تلقائياً؟ إليك أمثلة تسبب لي الارتباك: ```rust fn main() { let s = String::from("hello"); let r = &s; println!("{}", r.len()); // يعمل! لكن r هو &String وليس String let x = 5; let y = &x; let z = *y; // هنا أفهم — يجب إلغاء المرجع بشكل صريح println!("{}", z); // وهنا — لماذا يعمل؟ let v = vec![1, 2, 3]; let v_ref = &v; println!("{}", v_ref[0]); // v_ref هو &Vec، لكننا نستخدم الفهرسة } ``` قرأت عن traitين `Deref` و `DerefMut`، لكنني لا أفهم تماماً كيف يقرر المترجم متى يطبق الإلغاء التلقائي للمراجع. هل هناك مجموعة واضحة من القواعد؟ ولماذا في الـ