2.9.5 避免自引用结构体

译文 · 基于 Learning Rust

避免自引用结构体

原文链接: https://quinedot.github.io/rust-learning/pf-meta.html

所谓自引用,是指你有一个字段是引用,而该引用指向同一结构体中的另一个字段(或字段的内容)。

1
2
3
4
5
struct Snek<'a> {
    owned: String,
    // 比如你想让这个指向 `owned` 字段
    borrowed: &'a str,
}

构造这种自引用结构体的唯一安全方式是接受 &'a mut Snek<'a>,获取指向 owned 字段的 &'a str,并将其赋给 borrowed 字段。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# struct Snek<'a> {
#     owned: String,
#     // 比如你想让这个指向 `owned` 字段
#     borrowed: &'a str,
# }
#
impl<'a> Snek<'a> {
    fn bite(&'a mut self) {
        self.borrowed = &self.owned;
    }
}

如前所述, 这是一种反模式,因为你不能再直接使用自引用结构体。使用它的唯一方式是通过需要 &'a mut self 的方法调用返回的(重借用的)返回值。

所以从技术上讲是可能的,但限制如此之大,几乎总是毫无用处。

试图创建自引用结构体是新手常见的失误,你可能会看到对这类问题的回答大致是"在 safe Rust 中你不能这样做"。

最后修改 August 23, 2026: 更新 (499855b16)