Avatar ·

لماذا لا يُنصح باستخدام &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` هما بالفعل مراجع، ولا يمتلكان البيانات. أين المشكلة؟ هل هناك فرق في الأداء أو شيء آخر؟ اشرحوا لي، من فضلكم، بكلمات بسيطة.