在 Rust 中,Box:ed 结构与普通结构相比,其放置顺序是否有差异?

问题描述 投票:0回答:1

以下代码无法编译:

struct Ref<'a> {
    nbr: &'a u32,
}

fn func<'a>() {
    let nbr: u32 = 42;
    let _a_ref: Box<Ref<'a>> = Box::new(Ref { nbr: &nbr });
}

fn main() {
    func();
}

编译器抱怨

'nbr' does not live long enough
并且它在
func()
的末尾被删除,同时仍然是借用的。我基本上到处都搜索过,但我不明白为什么会出现这个错误。与声明相比,变量应该以相反的顺序删除,因此包含引用的盒装
Ref
应在删除
nbr
之前删除,对吧?

如果我将

func()
更改为:

fn func<'a>() {
    let nbr: u32 = 42;
    let _a_ref = Ref { nbr: &nbr };
}

它构建得很好!因此,盒装参考所需的生命周期/范围存在一些差异 - 但我找不到对这个明显基本问题的任何清晰和简单的解释。

为了让它更加混乱,我注意到如果我像这样声明

_a_ref
的类型:

fn func<'a>() {
    let nbr: u32 = 42;
    let _a_ref: Ref<'a> = Ref { nbr: &nbr };
}

我再次收到

'nbr' does not live long enough
错误。

最后,我使用了下划线,如下所示:

fn func<'a>() {
    let nbr: u32 = 42;
    let _a_ref: Ref<'_> = Ref { nbr: &nbr };
}

现在它又恢复正常了!这 3 种使用非装箱

Ref
结构体的方法有什么区别?它们与盒装版本相比如何?

rust scope lifetime
1个回答
1
投票

Box
不是这里的问题,
'a
才是。

&nbr
的寿命为
nbr
。但是
'a
是调用者选择的生命周期,它可能(甚至总是)比
nbr
的生命周期长。所以你不能将
Ref<'nbr>
分配给
Ref<'a>

Ref<'_>
的意思是“让编译器推断生命周期”,基本上相当于根本不指定类型。

© www.soinside.com 2019 - 2024. All rights reserved.