Avatar ·

لماذا لا يُنصح باستخدام &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` فكل شيء يعمل.