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)
    }
# }
最后修改 August 23, 2026: 更新 (499855b16)