تخطَّ إلى المحتوى

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 الكامل بالعربي.