`self` 之前的符号 (&) 在 Rust 中是什么意思?

What does the ampersand (&) before `self` mean in Rust?

我在 Rust 文档中看到过这段代码:

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

&self中的&是什么意思?

这意味着您将向对象传递 引用,而不是移动对象本身。区分这一点很重要,因为如果您的函数看起来像:

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

然后您尝试调用它 然后 使用之后的变量,您会得到一个错误

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

因为当您不指定 & 时,rust 会将值移动到函数中并且您的原始绑定不再拥有所有权。查看我创建的这个最小示例 (playground version):

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
}

现在将 something 切换为 eat 之前调用。因为 something 只需要一个 referenceg 仍然拥有所有权,您可以继续。另一方面,eat 移动 g 并且您不能再使用 g.