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: Собственность/заимствование - одна из ключевых особенностей ржавчины.
Попробуйте прочитать книгу, это действительно стоит того времени, когда вы потратите на нее.