لماذا لا يُنصح باستخدام &String أو &Vec أو &Box كوسائط للدوال في Rust؟
مرحباً بالجميع! بدأت تعلم Rust مؤخراً ولاحظت شيئاً غريباً. في بعض أمثلة الكود، أرى دوالاً تقبل معاملات مثل `&String` أو `&Vec` أو `&Box`. يبدو هذا منطقياً — فنحن نريد تمرير مرجع لتجنب نسخ البيانات. لكن بعد ذلك صادفت توصية بعدم فعل ذلك. لماذا؟ إنها مجرد مراجع!
إليك مثال كتبته:
```rust
fn print_string(s: &String) {
println!("{}", s);
}
fn print_vec(v: &Vec) {
for i in v {
println!("{}", i);
}
}
fn main() {
let my_string = String::from("Hello");
let my_vec = vec![1, 2, 3];
print_string(&my_string);
print_vec(&my_vec);
}
```
هذا الكود يعمل، لكنني سمعت أنه من الأفضل استخدام `&str` بدلاً من `&String` و `&[T]` بدلاً من `&Vec`. لماذا؟ فـ `&String` و `&Vec` هما بالفعل مراجع، ولا يمتلكان البيانات. أين المشكلة؟ هل هناك فرق في الأداء أو شيء آخر؟ اشرحوا لي، من فضلكم، بكلمات بسيطة.