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 اغلب مفیدتر خواهد بود.