بر

برش رشته در Rust

{one: "۱ تمرین", other: "%{count} تمرین"}

درباره‌ی برش رشته

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

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود