Stringと&strメモ

String

  • Vecの配列。ただし、中身はUTF-8のバイト列であることが保証されている。
  • 標準ライブラリなので、エディタなどでジャンプしても実装が確認できる。
  • ヒープ領域に確保され伸長可能。
#[derive(PartialOrd, Eq, Ord)]
#[cfg_attr(not(test), rustc_diagnostic_item = "string_type")]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct String {
    vec: Vec<u8>,
}

&str

  • UTF-8バイト列への参照。
  • プリミティブ型
  • スタック領域に確保され変更不可。
  • 文字列のリテラルは&'static str型

&が当たり前のようにセットになっているのはなぜ?

  • str自体は文字列であることを示す型でサイズの情報は持っていない。str型を変数に代入しようとすると、サイズ不定でスタック領域をどのくらい確保すれば良いのか分からずコンパイルエラーが発生する。&strとすることで、ポインタサイズ分領域を確保すれば良いことが明確になるのでコンパイルが可能となる。

参考

github.com

doc.rust-jp.rs

doc.rust-jp.rs

cipepser.hatenablog.com

ja.stackoverflow.com