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
.
根据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'tself
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
.