ما الفرق بين 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`؟