我在Rust文档中看到过这段代码:
fn eat(&self) {
println!("{} is done eating.", self.name);
}
&
中的&self
是什么意思?
答案 0 :(得分:29)
这意味着您将引用传递给对象,而不是移动对象本身。如果你的功能看起来像是这样的话,那就很重要了:
fn eat(self) {
println!("{} is done eating.", self.name);
}
然后您尝试使用该变量将其称为然后,您将收到错误
object = Foo::new();
object.eat();
object.something(); // error, because you moved object in eat
因为当您没有指定&
时,生锈会将值移动到该函数中,并且您的原始绑定不再具有所有权。看看我创建的这个最小例子(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
。
答案 1 :(得分:2)
答案在book:所有权/借款是生锈的关键特征之一。
尝试阅读这本书,真的值得花时间。