我有一个函数
foo
,它接受参数数组切片的数组切片,但是我似乎无法创建一个寿命足够长的变量来将其作为参数传递:
fn main() {
let mut outer_vec = vec![];
for i in 0..10 {
let inner_vec = vec![i];
outer_vec.push(inner_vec.as_slice());
}
foo(&outer_vec);
}
fn foo(_bar: &[&[u8]]) {
println!("foo");
}
我收到此错误:
error[E0597]: `inner_vec` does not live long enough
--> src/main.rs:5:24
|
5 | outer_vec.push(inner_vec.as_slice());
| ^^^^^^^^^^^^^^^^^^^^ borrowed value does not live long enough
6 | }
| - `inner_vec` dropped here while still borrowed
7 | foo(&outer_vec);
| ---------- borrow later used here
我知道给定的内部数组切片不能比它起源的
inner_vec
的生命周期长,它在 for 循环末尾被删除,但我想知道是否可以在不更改签名的情况下修复此错误foo
函数的功能,即保留 foo(_bar: &[&[u8]])
,而不将其更改为 foo(_bar: &[Vec<u8>])
之类的内容。
谢谢您的帮助。
您的问题与功能无关
foo
。它存在于 for
循环内。注释掉调用foo
,你仍然会遇到错误。在每次迭代中,您都会创建局部变量 inner_vec
,该变量在迭代结束时被删除。因此,您不能存储对它的引用来逃避 for
循环。换句话说,它的寿命太短了。
这里的解决方案是通过移动它(而不是引用)将
inner_vec
的所有权赋予 outer_vec
。那么您还必须更改 foo
的签名。
要为
foo
保留相同的签名,您可以创建一个变量来保留 inner_vec
的所有权,并在另一个变量中从中创建切片:
fn main() {
let mut outer_vec = vec![];
for i in 0..10 {
let inner_vec = vec![i];
outer_vec.push(inner_vec);
}
let vec_of_slices: Vec<&[u8]> = outer_vec.iter()
.map(|inner_vec| inner_vec.as_slice()).collect();
foo(&vec_of_slices);
}
fn foo(_bar: &[&[u8]]) {
println!("foo");
}
你可以使用
Vec::leak
和涡轮鱼来迫使切片永远存在:
let vec_of_slices =
outer_vec.iter()
.map(|inner_vec| inner_vec.leak::<‘static>())
.collect::<Vec<_>>();
当然,这样做的一个缺点是,正如
leak()
方法的名称所暗示的那样,这样做会泄漏内存。