Rust 所有権

Rust

Rustに所有権という考え方があるのですがややこしいのでまとめておきました。

Rust所有権の説明ページ

Sponsored Link


変数の内容がムーブすると・・・

以下のように変数を使おうとすると

let v = vec![1, 2, 3];

let v2 = v;

println!("v[0] is: {}", v[0]);

以下のようにエラーがでてしまいます。

error: use of moved value: `v`
println!("v[0] is: {}", v[0]);

これは、所有権を何か別のものに転送するとき、参照するものを「ムーブした」と言います。
上記の例では v の vecは v2 にムーブしたので v を使おうとするとエラーになってしまいます。

Copy型 〜 Primitiveにはデフォルトで実装されている

以下のような v は i32 でありPrimitiveの型になるのでエラーが発生しません。

let v = 1;

let v2 = v;

println!("v is: {}", v);

これは、Copy トレイトがデフォルトでPrimitive型には実装されているからです。
Copyトレイトは(上記場合では)i32がどこか別の場所へのポインタを持たず、コピーが完全コピーになるため、ムーブ(所有権の移転)ではなく完全コピーとして新しいものができるためです。

Primitive型以外の場合に所有権を保持するには

以下のように引数で渡された値を、返却する事によりもともとの変数がそのまま使えます。

fn foo(v: Vec) -> Vec {
    // vについての作業を行う

    // 所有権を返す
    v
}

let v1 = foo(v1);

まとめ

これはこの法則を知らないと普通にはまるので、頭に入れておいた方がいいですね。
それにしてもややこしい、、、

Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


Rust
Rust 数当てゲーム

前回の続きから。 今回は数当てゲームを作成してみます。 プログラムは1から100の間のあるランダムな …

Rust
Rustを学ぶ

Substrateのチュートリアルを見ていてRustの理解が必要不可欠な気がしたのでRustを少し学 …