Vec <Vec <u8 >>를 & [& [u8]] [duplicate]로 변환
Nov 08 2020
몇 개의 바이트 문자열을 취하는 함수가 &[&[u8]]있지만 유형 인수를 사용하여 호출하고 싶습니다 Vec<Vec<u8>>. 다음과 같이 함수를 호출합니다.
let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);
foo조각으로 변환 되지만 포함 된 값은 변환 되지 않습니다. 이 변환을 쉽고 효율적으로 수행 할 수있는 방법이 있습니까? 아니면 이와 같은 경우를 피하기 위해 함수 인수의 유형을 변경할 수 있습니까?
답변
2 L.F. Nov 08 2020 at 19:35
추가 할당없이이 경우를 처리하는 한 가지 방법 Vec은 다음을 사용 하는 것 입니다 AsRef<[u8]>.
fn bar<S: AsRef<[u8]>>(args: &[S]) {
// ...
}
함수 내에서를 사용 .as_ref()하여 각 인수를 &[u8].
( 놀이터 )
2 Locke Nov 08 2020 at 16:11
메모리 관점에서 이것은별로 말이되지 않습니다. 슬라이스를 만들려면 슬라이스중인 데이터가 먼저 메모리에 있어야합니다. 그러나의 조각 을 가져 오려면 먼저 조각을 가져 오는 &[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[..]);