文字列

これで、Rust における 2 つの文字列型を理解できます。

  • &str は UTF-8 エンコードされたバイトのスライスであり、&[u8] に似ています。
  • String は UTF-8 エンコードされたバイトの所有権を持つバッファであり、Vec<T> に似ています。
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

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[2..9];
    println!("s3: {s3}");
}
  • &str は文字列スライスを表します。これは、メモリブロックに格納された UTF-8 エンコード済み文字列データへの不変参照です。文字列リテラル("Hello") は、プログラムのバイナリに格納されます。

  • Rust の String 型は、バイトのベクタを包むラッパーです。Vec<T> と 同様に、所有権を持ちます。

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

  • format!() マクロは、動的な値から所有権を持つ文字列を生成する便利な方法です。 println!() と同じ書式指定を受け付けます。

  • & と必要に応じた範囲指定を使って、String から &str スライスを借用できます。 文字境界に揃っていないバイト範囲を選択すると、その式は panic します。chars イテレータは文字ごとに反復するため、文字境界を正しく扱おうとするよりもこちらが推奨されます。

  • C++ プログラマ向け: &str は C++ の std::string_view だと考えてください。 ただし、常にメモリ内の有効な文字列を指すものです。Rust の String は C++ の std::string に大まかに相当します(主な違い: UTF-8 エンコードされたバイトしか 含められず、small-string optimization は決して使用しません)。

  • バイト文字列リテラルを使うと、&[u8] 値を直接作成できます。

    // Copyright 2024 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn main() {
        println!("{:?}", b"abc");
        println!("{:?}", &[97, 98, 99]);
    }
  • raw 文字列を使うと、エスケープを無効にした &str 値を作成できます: r"\n" == "\\n"。引用符の両側に同じ数の # を使うことで、二重引用符を埋め込めます。

    // Copyright 2024 Google LLC
    // SPDX-License-Identifier: Apache-2.0
    
    fn main() {
        println!(r#"<a href="link.html">link</a>"#);
        println!("<a href=\"link.html\">link</a>");
    }