以下代码无法编译:
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()
的末尾被丢弃,而它仍然被borrow .我基本上到处都找过了,但我不明白为什么会发生这个错误.与声明相比,变量应该以相反的顺序被删除,所以包含引用的方框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 };
}
现在,它又建造得很好了!这三种使用非盒装Ref
struct 的方法有什么不同?它们与盒装变种相比又如何呢?