هناك طريقتان لتمثيل مصفوفة من الحروف في Rust: str وString.
str، المعروف أيضًا باسم «شريحة السلسلة النصية»، يُستخدم عادةً مع مرجع على الشكل &str.
لمعرفة السبب، قد يساعدك أن تفهم لماذا لن يُصرَّف سطر الكود التالي
const MY_CONST: str = *"Hello, World!";
// the size for values of type `str` cannot be known at compilation time
// the trait `Sized` is not implemented for `str`
حتى وإن كان طول النص الحرفي "Hello, World!" معروفًا في وقت التصريف، فإنه بصفته str يكون تسلسلًا مجهول الحجم.
لكنه بصفته مرجعًا إلى نص حرفي (&str)، فإنه يمتلك "مؤشرًا سمينًا" يحمل عنوان النص الحرفي وطوله في الذاكرة.
المؤشرات السمينة ذات حجم معروف، ولذلك سيُصرَّف هذا السطر
const MY_CONST: &str = "Hello, World!";
يمكن استبدال قيمة ارتباط قابل للتغيير بشريحة السلسلة النصية، لكن لا يمكن تعديله في مكانه.
مثال
let mut my_str = "Hello, World!";
my_str = "Hi!";
let mut my_string = String::from("Hello");
my_string.push_str(", World!"); // there is no equivalent function to modify &str
استخدام &str بدلًا من &String عند تعريف معامل لدالة يفرض قيودًا أقل، لأن هذا لن يُصرَّف
pub fn main() {
let my_str: &str = "Hello, World!";
say_hi(my_str);
}
fn say_hi(phrase: &String) {
println!("{phrase:?}");
}
// mismatched types
// expected reference `&String`
// found reference `&str`
لن يُحوَّل &str ضمنيًا إلى &String. لكن هذا سيُصرَّف
pub fn main() {
let my_string = String::from("Hello, World!");
say_hi(&my_string)
}
fn say_hi(phrase: &str) {
println!("{phrase:?}");
}
سيُحوَّل &String ضمنيًا إلى &str. لذا فإن استخدام نوع معامل من &str سيكون أكثر فائدة في كثير من الأحيان.