Rust 类型中的 & 符号是啥意思?
Posted
技术标签:
【中文标题】Rust 类型中的 & 符号是啥意思?【英文标题】:What does the ampersand (&) before `self` mean in Rust?Rust 类型中的 & 符号是什么意思? 【发布时间】:2015-11-01 17:20:51 【问题描述】:我在 Rust 文档中看到了这段代码:
fn eat(&self)
println!(" is done eating.", self.name);
&self
中的&
是什么意思?
【问题讨论】:
【参考方案1】:这意味着您将传递对象的引用,而不是移动对象本身。区分这一点很重要,因为如果您的函数看起来像:
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
只需要一个引用,g
仍然拥有所有权,您可以继续。另一方面,eat
移动了g
,你不能再使用g
。
【讨论】:
我想我明白了。我没有得到的一件事是在第二个示例中:函数 something: 你为什么将 &self 作为参数传递。您必须在 mathoods(impl) 中创建函数吗? @user3522940 我通过了&self
,因为我想告诉 rust not 移动值。这样,变量在函数调用之后保留所有权,尝试删除&
,你会得到同样的错误。重要的是要注意,移动不是复制,它实际上是移动以上是关于Rust 类型中的 & 符号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章