String
String is a growable UTF-8 encoded string:
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 メソッドを呼び出すことができます。
This slide should take about 5 minutes.
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にインデックスを付けるさまざまな方法を比較します。- 文字には
s3.chars().nth(i).unwrap()を使用します。ここでiは境界内の場合や境界外の場合を表します。 - 部分文字列には
s3[0..4]を使用します。このスライスは、文字境界にある場合とない場合があります。
- 文字には
- Many types can be converted to a string with the
to_stringmethod. This trait is automatically implemented for all types that implementDisplay, so anything that can be formatted can also be converted to a string.