String
String は、拡張可能な UTF-8 エンコード文字列です:
// Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 fn main() { let mut s1 = String::new(); s1.push_str("Hello"); println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity()); let mut s2 = String::with_capacity(s1.len() + 1); s2.push_str(&s1); s2.push('!'); println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity()); let s3 = String::from("🇨🇭"); println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count()); }
String は Deref<Target = str> を実装しているため、String に対して str のすべてのメソッドを呼び出せます。
String::newは新しい空の文字列を返します。文字列に追加したいデータ量が分かっている場合はString::with_capacityを使ってください。String::lenはStringのサイズをバイト単位で返します(これは文字数としての長さとは異なる場合があります)。String::charsは実際の文字を反復するイテレータを返します。書記素クラスタ により、charは人間が「文字」と見なすものとは異なる場合があることに注意してください。- 文字列に言及するとき、それは
&strまたはStringのどちらかを指している場合があります。 - 型が
Deref<Target = T>を実装していると、コンパイラによってTのメソッドを透過的に呼び出せるようになります。- まだ
Derefトレイトについては説明していないので、この時点では主にドキュメントのサイドバーの構造を説明するものです。 StringはDeref<Target = str>を実装しているため、strのメソッドに透過的にアクセスできます。let s3 = s1.deref();とlet s3 = &*s1;を書いて比較してみてください。
- まだ
Stringはバイトベクタを包むラッパーとして実装されており、ベクタでサポートされている多くの操作はStringでもサポートされていますが、いくつか追加の保証があります。Stringにインデックスアクセスするさまざまな方法を比較してください:- 文字に対しては、
iが範囲内の場合と範囲外の場合でs3.chars().nth(i).unwrap()を使います。 - 部分文字列に対しては、
s3[0..4]を使い、そのスライスが文字境界にある場合とない場合を試します。
- 文字に対しては、
- 多くの型は
to_stringメソッドで文字列に変換できます。このトレイトはDisplayを実装するすべての型に対して自動的に実装されるため、フォーマットできるものはすべて文字列にも変換できます。