2015-08-09 2 views

ответ

21

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

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.

+0

Я думаю, что получил. одна вещь, которую я не понял, есть во втором примере: функция что-то: вы проехали и я как параметр. Это то, что вам нужно сделать для создания функции в mathoods (impl)? – user3522940

+0

@ user3522940 Я прошел '& self', потому что я хотел сказать ржавчине ** не **, чтобы переместить значение. Таким образом, переменная сохраняет собственность за вызовом функции, попробуйте удалить '&', и вы получите ту же ошибку. Важно отметить, что движение не является копией, это буквально движение –

2

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

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