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