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 类型中的 & 符号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

Rust 声明性宏中的 @ 符号是啥意思?

Haskell 类型声明中的符号 `!` 是啥意思?

“Box<Fn() + Send + 'static>” 在 rust 中是啥意思?

UINT是啥定义类型?vc++

js中这些符号是啥意思:&,,===,!,++

js中这些符号是啥意思:&,,===,!,++