将Vec<Vec<u8>>转换为&[&[u8]]

3

我有一个接受一些字节数组字符串:&[&[u8]]的函数,但是想要使用类型为Vec<Vec<u8>>的参数调用它。像这样调用函数:

let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);

foo转换为一个切片,但不包含其所包含的值。有没有一种简单有效的方法进行这种转换?或者我可以更改函数参数的类型来避免这种情况吗?

2个回答

2

从内存角度来看,这样做没有太多意义。要创建一个切片,被切片的数据必须首先存在于内存中。然而,要对&[u8]进行切片,您首先需要有一些数据结构,比如Vec<&[u8]>,以便从中取出切片。

换句话说,要做到这一点,您需要为Vec<&[u8]>[&[u8]; N]分配空间,并首先填充它们的切片。这在某种程度上破坏了使用切片的目的,因为切片旨在直接引用现有的内存。考虑改用&[Vec<u8>]来替代您的函数。

如果第二层中具有切片很重要,或者您无法编辑该函数,则可以执行以下操作将Vec<Vec<u8>>转换为&[&[u8]]

let foo: Vec<Vec<u8>> = Vec::new();

// Allocate Vec of references to slices
let tmp: Vec<&[u8]> = foo.iter().map(|x| &x[..]).collect();

// Take slice of temporary Vec
bar(&tmp[..]);

2

在不分配额外的 Vec 的情况下处理这种情况的一种方法是使用AsRef<[u8]>:

fn bar<S: AsRef<[u8]>>(args: &[S]) {
    // ...
}

在这个函数中,你可以使用`.as_ref()`将每个参数转换为`&[u8]`。
示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接