変数束縛
Rust の所有権(ownership)のルールは以下の3つ(公式ドキュメントの「所有権とは?」より抜粋)。
- Rust の各値は、所有者と呼ばれる変数と対応している
- いかなる時も所有者は一つである
- 所有者がスコープから外れたら、値は破棄される
「値」は所有者である「変数」に束縛される。 これを「変数束縛(variable bindings)」と呼ぶ。
実際に変数束縛がどのように機能しているかを見てみよう。
Copy Semantics
Rust において組み込みで定義されるデータ型は以下の通り。
- スカラ型
- 整数 (
i8
,u8
, …,isize
,usize
) - 浮動小数点数型(
f32
,f64
) - 論理値型(
bool
) - 文字型(
char
): Unicode 符号点
- 整数 (
- 複合型
- タプル型
- 配列型
(詳しくは「型に関する覚え書き」を参照のこと)
スカラ型およびスカラ型で構成される複合型は値と変数が一体になっていて(値が固定長で直接スタックに積まれるため),代入時に値のコピーが発生する。
fn main() {
let mut ary1 = [1, 2, 3];
let ary2 = ary1;
ary1[0] *= 100;
println!("ary1 = {:?}", ary1); //Output: ary1 = [100, 2, 3]
println!("ary2 = {:?}", ary2); //Output: ary2 = [1, 2, 3]
}
イメージとしてはこんな感じ。