رشته‌ها

حالا می‌توانیم دو نوع رشته‌ای را در راست درک کنیم:

  • str& تکه‌ای از بایت‌های رمزگذاری‌شده UTF-8، شبیه به [u8]& است.
  • String is an owned buffer of UTF-8 encoded bytes, similar to Vec<T>.
fn main() {
    let s1: &str = "دنیا";
    println!("s1: {s1}");

    let mut s2: String = String::from("سلام");
    println!("s2: {s2}");
    s2.push_str(s1);
    println!("s2: {s2}");

    let s3: &str = &s2[s2.len() - s1.len()..];
    println!("s3: {s3}");
}
This slide should take about 10 minutes.

&str یک برش رشته‌ای را معرفی می‌کند، که یک مرجع غیرقابل تغییر به داده‌های رشته‌ای رمزشده UTF-8 است که در یک بلوک حافظه ذخیره شده است. لیترال های رشته‌ای String (”Hello”) در باینری برنامه ذخیره می‌شوند.

  • در راست نوع ‍ String یک wrapper بر روی یک بردار از بایت‌هاست. مانند Vec<T>، یک نوع Owned است.

  • مانند بسیاری از انواع دیگر، String::from() یک رشته از یک لیترال رشته ایجاد می‌کند. String::new() که رشته خالی جدید ایجاد می‌کند که داده های رشته‌ای می‌توانند با استفاده از متدهای push() و push_str() به آن اضافه شوند.

  • ماکرو format!() یک راه راحت برای ایجاد یک رشته Owned از مقادیر پویا است. مثل فرمت قابل پذیرش توسط ماکرو println!() است.

  • می‌توانید برش‌های &str را از String از طریق & و انتخابی محدوده انتخاب کنید. اگر محدوده بایتی را انتخاب کنید که با مرزهای نویسه تراز نباشد، عبارت وحشت می کند. تکرار کننده chars روی کاراکترها تکرار می شود و بر تلاش برای درست کردن مرزهای کاراکتر ترجیح داده می شود.

  • برای برنامه‌نویسان C++: &strرا به عنوان const char* در C++ درنظر بگیرید، اما یک فرق مهم این است که در راست که همیشه به یک رشته معتبر در حافظه اشاره می کند. راست نوع Stringمعادل تقریبی std::string در C++ است (با این تفاوت که فقط می‌تواند حاوی بایت‌های رمزشده UTF-8 باشد و هرگز از بهینه‌سازی Small-String استفاده نمی کند).

  • رشته‌های بایت به شما امکان می‌دهند مستقیماً یک مقدار &[u8] ایجاد کنید:

    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • رشته‌های خام به شما امکان می دهند یک مقدار &str با غیرفعال کردن فرارها ایجاد کنید: r"\n" == "\\n".شما می‌توانید با استفاده از تعداد برابر # در دو طرف دابل‌کوت دابل‌کوت‌ها، دابل‌کوت‌ها را جاسازی کنید:

    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }