السلاسل النصية
يمكننا الآن فهم نوعي السلاسل النصية (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}"); }
-
&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>"); }