2.9.4 &mut self 与 Self 别名
译文 · 基于 Learning Rust
&mut self 与 Self 别名
原文链接: https://quinedot.github.io/rust-learning/pf-self.html
fn foo(&'a mut self) 是一个危险信号——因为如果那个 'a 不是在函数上声明的,它很可能是 Self 结构体的一部分。如果是这样,这就是伪装起来的 &'a mut Thing<'a>。如上一节所讨论的, 这会使 self 之后无法使用,因此是一种反模式。
更一般地说,self 类型和 Self 别名包含类型构造器解析后的任何参数。
这意味着在这里:
1
2
3
4
5
6
7
| struct Node<'a>(&'a str);
impl<'a> Node<'a> {
fn new(s: &str) -> Self {
Node(s)
}
}
|
Self 是 Node<'a> 的别名。它不是 Node<'_> 的别名。所以这意味着:
1
| fn new<'s>(s: &'s str) -> Node<'a> {
|
而不是:
1
| fn new<'s>(s: &'s str) -> Node<'s> {
|
而你真正想写的是以下之一:
1
2
| fn new(s: &'a str) -> Self {
fn new(s: &str) -> Node<'_> {
|
同样,使用 Self 作为构造函数会使用已解析的类型参数。所以这样不行:
1
2
3
4
5
6
| # struct Node<'a>(&'a str);
# impl<'a> Node<'a> {
fn new(s: &str) -> Node<'_> {
Self(s)
}
# }
|
你需要
1
2
3
4
5
6
| # struct Node<'a>(&'a str);
# impl<'a> Node<'a> {
fn new(s: &str) -> Node<'_> {
Node(s)
}
# }
|