`self` 之前的符号 (&) 在 Rust 中是什么意思?
What does the ampersand (&) before `self` mean in Rust?
我在 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
因为当您不指定 &
时,rust 会将值移动到函数中并且您的原始绑定不再拥有所有权。查看我创建的这个最小示例 (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
只需要一个 reference,g
仍然拥有所有权,您可以继续。另一方面,eat
移动 g
并且您不能再使用 g
.
我在 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
因为当您不指定 &
时,rust 会将值移动到函数中并且您的原始绑定不再拥有所有权。查看我创建的这个最小示例 (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
只需要一个 reference,g
仍然拥有所有权,您可以继续。另一方面,eat
移动 g
并且您不能再使用 g
.