Rust:为什么当“self:&Self”时“self”不是引用?

Jac*_*ien 1 reference self rust

根据Rust Lang 编程书籍,我们知道:

&self 实际上是 self 的缩写:&Self

但是,从下面的示例( )中,根据错误消息,fn get_name我们编写的self: &Self, but不是引用而是对象本身。self为什么在这种情况下没有self参考?那么其中的&符号是做什么用的&Self呢?

示例:一个简单的结构体,其方法返回一个人的名字

struct Person {
    name: String
}

impl Person {
    fn new(name: &str) -> Person {
        Person {
            name: name.to_string()
        }
    }

    fn get_name(self: &Self) -> &String {
        self.name // Error: expected `&std::string::String`, found struct `std::string::String`
    }
}
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 6

因为自动取消引用

C 有.and->运算符,其中.应用于值和->指针。在 C 中,x->y完全等同于(*x).y.

Rust 有.但没有->,因此为了使语法友好,.当编译器找不到所请求的成员时通常会自动取消引用。在本例中,&Person没有name属性(因为引用不能有属性),因此编译器再次尝试取消引用 ( (*self).name),这次会在 上找到该属性Person

既然*self有型Person(*self).name就有型String。要解决此问题,您可以通过执行 来引用字符串&self.name,这与(为了清楚起见添加了额外的括号)含义相同&((*self).name)

直接回答你的问题:

...self根据错误消息,不是引用而是对象本身。为什么在这种情况下没有self参考?

错误消息仅涉及该String属性,并没有真正为您提供任何信息selfself确实是一个参考。如果你把它扔进你的impl Person

fn test(&self) { self }
Run Code Online (Sandbox Code Playgroud)

然后编译器会告诉你self是什么(因为它与隐含的返回类型不匹配()):

error[E0308]: mismatched types
  --> src/lib.rs:12:18
   |
12 | fn test(&self) { self }
   |                - ^^^^ expected `()`, found `&Person`
   |                |
   |                expected `()` because of default return type
Run Code Online (Sandbox Code Playgroud)

请注意,如果您说 ,您将看到相同的编译器错误fn get_name(&self)。此错误不是由self: &Self语法引起的;而是由语法引起的。它确实相当于&self.