Avatar ·

ما الفرق بين String و str في Rust؟ ومتى نستخدم أيهما؟

مرحبًا أيها الزملاء! بدأت تعلم Rust وواجهت موضوعًا محيرًا جدًا — السلاسل النصية. في التوثيق أجد باستمرار `String` و `&str`، لكنني لا أستطيع فهم الفرق بينهما ومتى أستخدم كل نوع. لقد كتبت مثالًا صغيرًا: ```rust fn main() { let s1 = "hello"; // هل هذا str؟ let s2 = String::from("hello"); // وهل هذا String؟ println!("{}", s1); println!("{}", s2); // لماذا يعمل هذا؟ let s3: &str = &s2; println!("{}", s3); // وهل هذا لا يعمل؟ // let s4: String = s1; // خطأ! } ``` أرى أن `s1` هو نص حرفي (string literal)، و `s2` يُنشأ عبر `String::from()`. لكن عندما أحاول تعيين `s1` لمتغير من نوع `String`، يشتكي المترجم. بينما يمكنني أخذ مرجع لـ `s2` وتعيينه إلى `&str`. هل يمكن لأحد أن يشرح بكلمات بسيطة: 1. ما هو `String` وما هو `str`؟ 2. لماذا يأتي `str` دائمًا مع علامة العطف (`&str`)؟ 3. في أي الحالات يجب استخدام `String` ومتى `&str`؟