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

时间:2020-11-08 06:13:42

标签: rust

我有一个需要一定数量的字节字符串的函数:&[&[u8]],但想用类型为Vec<Vec<u8>>的参数来调用它。像这样调用函数:

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

foo转换为切片,但不转换为其中包含的值。有没有一种方法可以轻松高效地完成此转换?还是可以更改函数参数的类型以避免这种情况?

2 个答案:

答案 0 :(得分:2)

从内存角度看,这没有多大意义。要创建切片,要切片的数据必须首先存在于内存中。但是,要获取console.error MongoNetworkError: connection 1 to 127.0.0.1:50603 closed 的一部分,您首先需要具有某种数据结构,例如&[u8]才能获取该切片。

换句话说,您需要为Vec<&[u8]>Vec<&[u8]>分配空间,并首先用切片填充它。这在某种程度上违背了使用分片的目的,因为分片的目的是将其存储到现有的参考内存中。考虑改用[&[u8]; N]作为函数。

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

&[&[u8]]

答案 1 :(得分:2)

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

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

在函数内部,您可以使用.as_ref()将每个参数转换为&[u8]

playground