文字列

We can now understand the two string types in Rust:

  • &str is a slice of UTF-8 encoded bytes, similar to &[u8].
  • String is an owned buffer of UTF-8 encoded bytes, similar to 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}");
}
This slide should take about 10 minutes.
  • &str introduces a string slice, which is an immutable reference to UTF-8 encoded string data stored in a block of memory. String literals ("Hello"), are stored in the program’s binary.

  • Rust's String type is a wrapper around a vector of bytes. As with a Vec<T>, it is owned.

  • 他の多くの型と同様に、String::from() は文字列リテラルから文字列を作成します。String::new() は新しい空の文字列を作成します。push() メソッドと push_str() メソッドを使用して、そこに文字列データを追加できます。

  • format!() マクロを使用すると、動的な値から所有文字列を簡単に生成できます。これは println!() と同じ形式指定を受け入れます。

  • & を使用して String から &str スライスを借用し、必要に応じて範囲を選択できます。文字境界に揃えられていないバイト範囲を選択すると、その式でパニックを起こします。chars イテレータは文字単位で処理するため、正しい文字境界を取得しようとすることよりも、このイテレータを使用するほうが望ましいです。

  • C++ プログラマー向けの説明:&str は常にメモリ上の有効な文字列を指しているようなC++ の std::string_view と考えられます。Rust の String は、C++ の std::string とおおむね同等です(主な違いは、UTF-8 でエンコードされたバイトのみを含めることができ、短い文字列に対する最適化が行われないことです)。

  • バイト文字列リテラルを使用すると、&[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>");
    }