ما هي القواعد الدقيقة للإلغاء التلقائي للمراجع (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`، لكنني لا أفهم تماماً كيف يقرر المترجم متى يطبق الإلغاء التلقائي للمراجع. هل هناك مجموعة واضحة من القواعد؟ ولماذا في الـ