文字列
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 toVec<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}"); }
-
&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 aVec<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>"); }