Ответ 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
.