🌊

Rustにおける関数と所有権の移動

2021/03/31に公開

所有権の移動

  • 所有者が関数の実引数として渡される時、所有権は関数の仮引数に移動します。
  • そのため、移動後は元の関数内の変数は使用できなくなります。

例:

struct Foo {
    x: i32,
}

fn do_something(f: Foo) {
    println!("{}", f.x);
    // ② : 引数fはここでドロップします。
}

fn main() {
    let foo = Foo { x: 13 };
    // ① : 変数fooの所有権はdo_somethingに移動します。
    do_something(foo);
    // ③ : 変数fooは使えなくなります。
}

[実行結果]

❯ cargo run
   Compiling variables v0.1.0 (/Users/yoshitaka.koitabashi/Desktop/variables)
    Finished dev [unoptimized + debuginfo] target(s) in 1.28s
     Running `target/debug/variables`
13

所有権を関数から返却する

  • 下記のように所有権を関数から返却する方法もあります。
  • ただ、下記のような処理が複数書かれ、それにより所有権を取ったり戻したりすることを関数で行うとかなり複雑になります。
  • これを回避する方法が参照と呼ばれる機能です。

例:

struct Foo {
    x: i32,
}

fn do_something() -> Foo {
    Foo { x: 13 }
    // ②:所有権が関数に移動します。
    // ③:所有権は関数(do_something)外に移動します。
}

fn main() {
    let foo = do_something();
    // ①:変数fooは所有者になります。
    // ④:関数のスコープの終端により、変数fooはドロップします。
}

参考文献

Discussion