コレクションの一部を安全に参照する方法を学びます
所有権システムの重要な要素として「スライス」があります。スライスは、コレクション全体への参照を持つのではなく、コレクションの一部への参照を可能にするデータ型です。特に文字列の扱いにおいて、スライスは中心的な役割を果たします。
スライスとは?
スライスは、配列やベクタ、文字列などの連続したデータ構造の一部分を指す参照です。スライス自体はデータを持たず、元のデータへのポインタとその長さを保持します。これにより、データのコピーを作成することなく、効率的にデータの一部にアクセスできます。
例えば、配列の一部を参照したい場合、スライスを使用できます。
ポイント: スライスは
&[T]
という型を持ちます。T
は要素の型です。範囲指定 [start..end]
を使って作成します。start
は含む、end
は含まないインデックスです。 文字列の扱い: `String` と `&str`
Rustには主に2種類の文字列型があります。
String
: ヒープ上に確保され、伸長可能で、所有権を持つUTF-8エンコードされた文字列。&str
(文字列スライス): 他の場所に保存されているUTF-8文字列データの一部または全体への参照(借用)。文字列リテラルは&'static str
型です。
String
の操作
String
は変更可能な文字列です。
文字列スライス (&str
)
&str
は不変の参照であり、文字列リテラルや String
の一部を指すのに使われます。
注意: Rustの文字列はUTF-8エンコードされています。文字によっては1バイト以上を消費するため、スライスを作成する際はバイトインデックスを指定します。文字の境界以外でスライスしようとするとパニックが発生します。
文字単位で操作したい場合は、.chars()
メソッドなどを検討しましょう。 String
と &str
の関係
String
から&str
を作成するのは簡単で低コストです(借用するだけ)。&my_string
や&my_string[..]
のようにします。&str
から新しいString
を作成するには、.to_string()
メソッドやString::from()
を使います。これはデータのコピーを伴います。- 関数が文字列データを必要とする場合、所有権が必要なければ
&str
を引数に取るのが一般的です。これにより、String
と&str
の両方を柔軟に受け入れることができます(Deref 強制型変換のため)。
まとめ
- スライス (
&[T]
,&str
): コレクションの一部または全体への参照。データ自体は所有しない。 String
: 所有権を持つ、伸長可能なUTF-8文字列。ヒープに格納される。&str
: 不変の文字列スライス。文字列リテラルやString
の一部/全体を参照する。- 文字列のスライスはバイトインデックスで行う。UTF-8の文字境界に注意が必要。
- 関数は、所有権が不要なら
&str
を引数に取ることで、String
と&str
の両方を受け入れやすくなる。
スライスと文字列の基本を理解することは、Rustで効率的かつ安全なコードを書く上で非常に重要です。特に &str
は頻繁に登場するので、その性質をしっかり掴んでおきましょう!