السلاسل النصية

يمكننا الآن فهم نوعي السلاسل النصية (string types) في Rust:

  • &str هو شريحة (slice) من بايتات مشفرة بـ UTF-8، مشابهة لـ &[u8].
  • String هو مخزن مؤقت مملوك (owned buffer) من بايتات مشفرة بـ UTF-8، مشابه لـ Vec<T>.
fn main() {
    let s1: &str = "World";
    println!("s1: {s1}");

    let mut s2: String = String::from("Hello ");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");

    let s3: &str = &s2[s2.len() - s1.len()..];
    println!("s3: {s3}");
}
This slide should take about 10 minutes.
  • &str يقدم شريحة نصية (string slice)، وهي مرجع غير قابل للتغيير (immutable reference) لبيانات نصية مشفرة بـ UTF-8 مخزنة في كتلة من الذاكرة. الحروف النصية ("Hello")، مخزنة في البرنامج الثنائي (binary).

  • نوع String في Rust هو غلاف حول متجه من البايتات (vector of bytes). كما هو الحال مع Vec<T>، فهو مملوك (owned).

  • كما هو الحال مع العديد من الأنواع الأخرى، فإن String::from() ينشئ سلسلة نصية من حرف نصي (string literal)؛ String::new() ينشئ سلسلة نصية جديدة فارغة، يمكن إضافة بيانات نصية إليها باستخدام طريقتي push() و push_str().

  • الماكرو format!() هو طريقة مريحة لإنشاء سلسلة نصية مملوكة (owned string) من قيم ديناميكية. يقبل نفس مواصفات التنسيق (format specification) مثل println!().

  • يمكنك استعارة شرائح &str من String عبر & واختيار النطاق (range selection) اختياريًا. إذا اخترت نطاق بايت غير متوافق مع حدود الأحرف، فإن التعبير سيتسبب في خطأ (panic). المكرر chars يتكرر عبر الأحرف ويفضل استخدامه على محاولة الحصول على حدود الأحرف بشكل صحيح.

  • لمبرمجي C++: فكر في &str كـ std::string_view من C++، ولكنه دائمًا يشير إلى سلسلة نصية صالحة في الذاكرة. String في Rust هو مكافئ تقريبي لـ std::string من C++ (الفرق الرئيسي: يمكن أن يحتوي فقط على بايتات مشفرة بـ UTF-8 ولن يستخدم أبدًا تحسين السلسلة الصغيرة (small-string optimization)).

  • الحروف النصية للبايت (Byte strings literals) تتيح لك إنشاء قيمة &[u8] مباشرةً:

    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • السلاسل النصية الخام (Raw strings) تتيح لك إنشاء قيمة &str مع تعطيل الهروب (escapes): r"\n" == "\\n". يمكنك تضمين علامات الاقتباس المزدوجة باستخدام كمية متساوية من # على جانبي علامات الاقتباس:

    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }