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 被称为 beforeeat . 因为 something 仅接受引用, g 仍然拥有所有权,您可以继续 . 另一方面 eat 移动 g 并且您不再可以使用 g .
2 回答
这意味着您将向对象传递 reference ,而不是移动对象本身 . 区分这一点很重要,因为如果你的函数看起来像:
然后你尝试调用它然后使用变量,你会收到一个错误
因为当您未指定
&
时,生锈会将值移动到函数中,并且您的原始绑定不再具有所有权 . 看看我创建的这个最小的例子(playground version):现在切换
something
被称为 beforeeat
. 因为something
仅接受引用,g
仍然拥有所有权,您可以继续 . 另一方面eat
移动g
并且您不再可以使用g
.答案在book:所有权/借款是生锈的关键特征之一 .
试着阅读这本书,真的值得花时间 .