小能豆

为什么我不能在同一结构中存储值和对该值的引用?

rust

我有一个值,我想以我自己的类型存储该值以及对该值内某些内容的引用:

struct Thing {
    count: u32,
}

struct Combined<'a>(Thing, &'a u32);

fn make_combined<'a>() -> Combined<'a> {
    let thing = Thing { count: 42 };

    Combined(thing, &thing.count)
}

有时,我有一个值,我想将该值以及对该值的引用存储在同一结构中:

struct Combined<'a>(Thing, &'a Thing);

fn make_combined<'a>() -> Combined<'a> {
    let thing = Thing::new();

    Combined(thing, &thing)
}

有时,我什至没有引用该值,但会得到相同的错误:

struct Combined<'a>(Parent, Child<'a>);

fn make_combined<'a>() -> Combined<'a> {
    let parent = Parent::new();
    let child = parent.child();

    Combined(parent, child)
}

在每种情况下,我都会收到一个错误,指出其中一个值“寿命不够长”。这个错误是什么意思?


阅读 86

收藏
2024-05-21

共1个答案

小能豆

这个错误提示表明在你的代码中存在生命周期不匹配的问题,也就是生命周期不足以涵盖所有需要引用的对象。具体来说,在 Combined 结构体中,你试图存储一个对象及其引用,但 Rust 编译器无法确定这个引用的生命周期能否长于对象本身。

让我们逐个分析你的例子:

  1. Combined 结构体中,你尝试存储一个 Thing 对象及其引用,这样的话,引用的生命周期必须至少长于 Thing 对象的生命周期。在 make_combined 函数中,你创建了一个 Thing 对象 thing,然后尝试将其引用作为 Combined 结构体的一部分返回。然而,在 make_combined 函数结束后,thing 对象会被销毁,但是 Combined 结构体中的引用仍然存在,这就导致了生命周期不匹配的错误。

  2. 在第二种情况下,你尝试存储一个 Thing 对象及其引用,但这次引用是对对象本身的引用,而不是对内部数据的引用。同样地,由于在 make_combined 函数结束后,thing 对象会被销毁,因此在 Combined 结构体中的引用将会指向一个已经销毁的对象,这也是生命周期不匹配的错误。

  3. 在第三种情况下,你尝试存储一个 Parent 对象及其 Child 对象的引用。同样的问题也存在于这里,由于在 make_combined 函数结束后,parent 对象会被销毁,但 Combined 结构体中的 Child 引用仍然存在,因此会导致生命周期不匹配的错误。

要解决这个问题,你需要确保引用的生命周期能够涵盖被引用对象的生命周期,或者使用类似 RcArc 这样的引用计数类型来管理对象的生命周期。

2024-05-21