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

问题描述 投票:0回答:3

我有一个函数

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>])
之类的内容。

谢谢您的帮助。

rust slice lifetime
3个回答
1
投票

您的问题与功能无关

foo
。它存在于
for
循环内。注释掉调用
foo
,你仍然会遇到错误。在每次迭代中,您都会创建局部变量
inner_vec
,该变量在迭代结束时被删除。因此,您不能存储对它的引用来逃避
for
循环。换句话说,它的寿命太短了。

这里的解决方案是通过移动它(而不是引用)将

inner_vec
的所有权赋予
outer_vec
。那么您还必须更改
foo
的签名。


1
投票

要为

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

0
投票

你可以使用

Vec::leak
和涡轮鱼来迫使切片永远存在:

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

当然,这样做的一个缺点是,正如

leak()
方法的名称所暗示的那样,这样做会泄漏内存。

© www.soinside.com 2019 - 2024. All rights reserved.