String / &str
النصوص String / &str
String نص قابل للتعديل ومملوك على الكومة، وstr شريحة نصّية غير مملوكة — التمييز بينهما أساسي جدًا في Rust.
Rust تفصل بين نوعين للنصوص: String نص مملوك، قابل للنمو والتعديل، مخزَّن على الكومة؛ وstr (يُستخدم غالبًا كمرجع &str) شريحة نصّية غير مملوكة تشير لبيانات نصّية في مكان آخر (ثابتة في البرنامج أو جزء من String). كل النصوص في Rust مُرمَّزة بـ UTF-8 إلزاميًا.
قاعدة عامة: استخدم &str كنوع معامل دالة عند القراءة فقط (أعم وأخف)، واستخدم String عندما تحتاج فعليًا امتلاك النص وتعديله أو إرجاعه من دالة.
الصياغة
let s: String = String::from("text");
let s: &str = "text";
s.push_str("...");📄 مثال
let mut owned = String::from("مرحبًا");
owned.push_str(" بالعالم");
fn greet(name: &str) -> String {
format!("أهلًا {name}")
}
println!("{}", greet(&owned));أهم النقاط
| العنصر | الوظيفة |
|---|---|
| String::from(s) | بناء String مملوك من شريحة نصّية &str |
| &str | مرجع لبيانات نصّية، لا يملكها ولا يمكنه تغيير طولها |
| .push_str(s) / .push(c) | إضافة شريحة نصّية / حرف واحد لـ String |
| format!(...) | بناء String جديد بدمج قيم، شبيه println! لكن يُعيد نصًا |
💡 نصائح عملية
- استخدم &str كنوع معامل الدوال دائمًا ما أمكن — يقبل &String أيضًا عبر التحويل التلقائي (deref coercion)
- تذكّر أن الفهرسة المباشرة s[0] غير مسموحة لأن UTF-8 متغيّر طول البايت لكل حرف — استخدم .chars() بدلًا منها
⚠️ أخطاء شائعة
- محاولة الفهرسة المباشرة لنص بـ s[i] كأنه مصفوفة بايتات — Rust ترفض هذا لضمان صحة UTF-8
- دمج نصّين بـ + بشكل متكرّر داخل حلقة بدل format! أو push_str — أبطأ ويستهلك تخصيصات زائدة
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار RUST الكامل بالعربي.