struct Foo<'a> {
h: &'a mut Vec<usize, &'a Bump>
}
pub fn s () {
let s = Bump::new();
{
let mut bar = Vec::new_in(&s);
{
Foo {
h: &mut bar,
};
}
}
}
这个会产生错误
h: &mut bar,
| ^^^^^^^^ borrowed value does not live long enough
struct Foo<'a> {
h: &'a Vec<usize, &'a Bump>
}
pub fn s () {
let s = Bump::new();
{
let bar = Vec::new_in(&s);
{
Foo {
h: &bar,
};
}
}
}
这个就是好的,为什么
1
共 3 条评论, 1 页
评论区
写评论--
👇
Bai-Jinlin: 你用的应该是bumpalo,那写成这样就行了,你生命周期本来就写的有问题。
我理解理解,太难了,这个声明周期和协变抗变!
想了一下午,rust好难啊。贴一下我的理解,如有错误还请斧正。
这是编译不通过的情况(
&mut bar
):这是编译通过的情况(
&bar
)总的来说,不是【可变借用和不可变借用的drop顺序不一样】,而是型变和不恰当的生命周期标注导致DropCheck失败了。
DropCheck: https://doc.rust-lang.org/nomicon/dropck.html
型变: https://doc.rust-lang.org/nomicon/subtyping.html
你用的应该是bumpalo,那写成这样就行了,你生命周期本来就写的有问题。