rust 创建一个具有足够生命周期的切片

tkclm6bt  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(123)

我有一个函数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>])的东西。
感谢你的帮助.

brgchamk

brgchamk1#

你的问题与函数foo无关。它存在于for循环中。注解掉调用foo,仍然会有错误。在每次迭代中,您创建局部变量inner_vec,并在迭代结束时删除。因此,您不能存储对它的引用,这将逃脱for循环。换句话说,它的寿命很短。
这里的解决方案是通过移动inner_vec(而不是引用)将inner_vec的所有权给予给outer_vec。那么您还必须更改foo的签名。

ujv3wf0j

ujv3wf0j2#

要保持foo的签名相同,可以创建一个变量来保持inner_vec s的所有权,并在另一个变量中创建切片:

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");
}
bkhjykvo

bkhjykvo3#

你可以使用Vec::leak和turbofish来强制切片永远存在:

let vec_of_slices =
    outer_vec.iter()
    .map(|inner_vec| inner_vec.leak::<‘static>())
    .collect::<Vec<_>>();

当然,这样做的一个缺点是,正如leak()方法的名称所示,这样做会泄漏内存。

相关问题