Rust:为什么在 "self: &Self" 时 "self" 不是引用?

Rust: Why isn't "self" a reference when "self: &Self"?

根据Rust Lang Programming Book,我们知道:

The &self is actually short for self: &Self

但是,从下面的例子(fn get_name)来看,我们写了self: &Self,但是根据报错信息,self不是引用而是对象本身。为什么 self 在这种情况下不是参考?那么 &Self 中的符号是什么?

示例:一个简单的结构,其方法是returns一个人的名字

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`
    }
}

因为.

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

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

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

直接解决您的问题:

... self is not a reference but the object itself according to the error message. Why isn't self a reference in this case?

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

fn test(&self) { self }

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

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

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