لماذا لا يُنصح باستخدام &String و &Vec و &Box كوسائط للدوال في Rust؟
مرحبًا بالجميع! لقد بدأت مؤخرًا في تعلم Rust ولاحظت شيئًا غريبًا: في العديد من الأدلة وعلى Stack Overflow، يُكتب أنه لا ينبغي كتابة دوال تقبل `&String` أو `&Vec` أو `&Box`. بدلاً من ذلك، يُنصح باستخدام `&str` و `&[T]` و `&T` (أو `&T` لـ Box). لكني لست متأكدًا تمامًا من المشكلة.
إليك مثال بسيط كتبته للعمل مع النصوص:
```rust
fn print_length(s: &String) {
println!("طول السلسلة: {}", s.len());
}
fn main() {
let my_string = String::from("مرحبًا بالعالم!");
print_length(&my_string);
}
```
هذا الكود يعمل. لماذا يُعتبر أسلوبًا سيئًا؟ كيف يكون `&String` أسوأ من `&str`؟ ونفس الشيء مع المتجهات: كيف يكون `&Vec` أسوأ من `&[i32]`؟ ففي كلتا الحالتين، أنا أمرر مرجعًا وليس ملكية.
ما يربكني هو أنه إذا كتبت دالة بـ `&str`، فعند استدعائها مع `String` سأضطر في كل مرة إلى تحويل النوع صراحةً: `print_length(&my_string[..])` أو `print_length(my_string.as_str())`. أما مع `&String` فكل شيء يعمل.