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)
因为自动取消引用。
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属性,并没有真正为您提供任何信息self。 self确实是一个参考。如果你把它扔进你的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.
| 归档时间: |
|
| 查看次数: |
746 次 |
| 最近记录: |