Я видел этот код в документации Rust:Что означает амперсанд в виде ржавчины?
fn eat(&self) {
println!("{} is done eating.", self.name);
}
что делает &
в &self
означает?
Я видел этот код в документации 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
, потому что, когда вы надеваете» t указать &
, ржавчина перемещает значение в функцию, а ваше оригинальное связывание больше не имеет права собственности. проверить это минимальный пример, который я создал (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
занимает только ссылка, g
все еще имеет право собственности, и вы можете продолжить. eat
, с другой стороны, перемещается g
, и вы больше не можете использовать g
.
Ответ в book: Собственность/заимствование является одним из ключевых признаков ржавчины.
Попытайтесь прочитать книгу, это действительно стоит того времени, когда вы потратите на нее.
Я думаю, что получил. одна вещь, которую я не понял, есть во втором примере: функция что-то: вы проехали и я как параметр. Это то, что вам нужно сделать для создания функции в mathoods (impl)? – user3522940
@ user3522940 Я прошел '& self', потому что я хотел сказать ржавчине ** не **, чтобы переместить значение. Таким образом, переменная сохраняет собственность за вызовом функции, попробуйте удалить '&', и вы получите ту же ошибку. Важно отметить, что движение не является копией, это буквально движение –