我有一个函数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>])
的东西。
感谢你的帮助.
3条答案
按热度按时间brgchamk1#
你的问题与函数
foo
无关。它存在于for
循环中。注解掉调用foo
,仍然会有错误。在每次迭代中,您创建局部变量inner_vec
,并在迭代结束时删除。因此,您不能存储对它的引用,这将逃脱for
循环。换句话说,它的寿命很短。这里的解决方案是通过移动
inner_vec
(而不是引用)将inner_vec
的所有权给予给outer_vec
。那么您还必须更改foo
的签名。ujv3wf0j2#
要保持
foo
的签名相同,可以创建一个变量来保持inner_vec
s的所有权,并在另一个变量中创建切片:bkhjykvo3#
你可以使用
Vec::leak
和turbofish来强制切片永远存在:当然,这样做的一个缺点是,正如
leak()
方法的名称所示,这样做会泄漏内存。