文字列
これで、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>"); }