Что означает амперсанд в типе ржавчины?

Я видел этот код в документации Rust:

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

что означает & in &self?

Ответ 1

Это означает, что вы будете передавать ссылку на объект, а не на перемещение самого объекта. Это важно различать, потому что если ваша функция выглядит так:

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

и вы попытались вызвать его, используя переменную после, вы получите сообщение об ошибке

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

потому что, если вы не укажете &, ржавчина перемещает значение в функцию, и ваша первоначальная привязка больше не имеет владельца. посмотрите на этот минимальный пример, который я создал (детская площадка версия):

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 принимает только ссылку, g все еще имеет право собственности, и вы можете продолжить. eat, с другой стороны, перемещает g, и вы больше не можете использовать g.

Ответ 2

Ответ находится в book: Собственность/заимствование - одна из ключевых особенностей ржавчины.

Попробуйте прочитать книгу, это действительно стоит того времени, когда вы потратите на нее.