web-dev-qa-db-ja.com

Rustタイプでのアンパサンドの意味は?

私はRustのドキュメントでこのコードを見ました:

fn eat(&self) {
    println!("{} is done eating.", self.name);
}

& in &self意味ですか?

29
user3522940

これは、オブジェクト自体を移動するのではなく、オブジェクトへの参照を渡すことを意味します。関数を次のようにした場合、これを区別するためにインポートします。

fn eat(self) {
    println!("{} is done eating.", self.name);
}

そして、あなたはそれを呼び出した後、変数を使用して、エラーが発生します

object = Foo::new();
object.eat();
object.something(); // error, because you moved object in eat

&を指定しない場合、Rustは値を関数に移動し、元のバインディングには所有権がなくなります。私が作成したこの最小限の例を確認してください( 遊び場バージョン ):

struct Foo {
    x : u32
}

impl Foo {

    fn eat(self) {
        println!("eating");
    }

    fn something(&self) {
        println!("else");
    }

}

fn main() {
    println!("Hello, world!");

    let g = Foo { x: 5 };
    g.eat();
    g.something();  // if this comes before eat, no errors because we arent moving
}

ここで、somethingbeforeeatと呼ぶように切り替えます。 something参照のみを取るため、gは引き続き所有権を持ち、続行できます。一方、eatgに移動し、gを使用できなくなります。

37