我有一个需要一定数量的字节字符串的函数:&[&[u8]]
,但想用类型为Vec<Vec<u8>>
的参数来调用它。像这样调用函数:
let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);
将foo
转换为切片,但不转换为其中包含的值。有没有一种方法可以轻松高效地完成此转换?还是可以更改函数参数的类型以避免这种情况?
答案 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]
。