我有一个接受一些字节数组字符串:&[&[u8]]
的函数,但是想要使用类型为Vec<Vec<u8>>
的参数调用它。像这样调用函数:
let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);
将foo
转换为一个切片,但不包含其所包含的值。有没有一种简单有效的方法进行这种转换?或者我可以更改函数参数的类型来避免这种情况吗?
我有一个接受一些字节数组字符串:&[&[u8]]
的函数,但是想要使用类型为Vec<Vec<u8>>
的参数调用它。像这样调用函数:
let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);
将foo
转换为一个切片,但不包含其所包含的值。有没有一种简单有效的方法进行这种转换?或者我可以更改函数参数的类型来避免这种情况吗?
从内存角度来看,这样做没有太多意义。要创建一个切片,被切片的数据必须首先存在于内存中。然而,要对&[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[..]);
在不分配额外的 Vec
的情况下处理这种情况的一种方法是使用AsRef<[u8]>
:
fn bar<S: AsRef<[u8]>>(args: &[S]) {
// ...
}