所有権まわりの話

所有権周りの話をします

    Loading...

## 文字列に関する型

char

  • 意味:1文字(Unicodeスカラー値)
  • サイズ:常に4バイト(UTF-32的な表現)
  • 性質:プリミティブ型でありCopy
  • 用途:1文字だけを使いたいとき
// main.rs
let c: char = '';
println!("{}", c)

str

  • 意味:UTF-8 バイト列としてエンコードされた文字列全体
  • サイズ:コンパイル時にはわからない可変長
  • 性質:自身はSizedではないので、必ず参照型(&str)として扱う
  • 用途:複数の文字をまとめて扱いたいとき
let s: &str = "こんにちは";
let s = String::from(s);

for b in s.chars() {
    println!("{} {:x?}", b, b.to_string().as_bytes());
}

## 変数の代入

文字列を例にして変数の代入時に生じていることを理解する。

let s1 = String::from("hello");
let s2 = s1;

変数s1は、文字列リテラルhelloから作られるString型の変数である。 :::note 文字列リテラルは読み取り専用・固定長であり、その型は&'static strと表される。 :::

s1s2に代入すると、String型のデータがコピーされる。

## 所有権と関数

:::tip[引数としての変数] 関数の引数に変数を渡すと、変数の代入のようにムーブやコピーされる。 したがって、関数の引数として元となったものは使えなくなる。

Copy Traitなオブジェクトであればムーブをしないため、元の変数はそのまま利用できる。 :::

fn main() {
    let s = String::from("hello");  // sがスコープに入る

    takes_ownership(s);
    println!("{}", s); // コンパイルエラー

    let x = 5; // i32

    makes_copy(x);
    println!("{}", x) // i32はCopy Traitなのでmoveされない
}

fn takes_ownership(some_string: String) {
    println!("{}", some_string);
}

fn makes_copy(some_integer: i32) {
    println!("{}", some_integer);
}

## 参照