rust 将Vec转换为引用切片的最佳方法是什么?

xzlaal3s  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(207)

假设我在Vec中有一些结构体示例:

let records: Vec<Foo> = ...;

我需要将它们与一个函数一起使用,该函数将引用切片作为参数:

fn my_func(arg: &[&Foo]) { ... }

如何从Vec中获取引用的切片?我看到有一个as_slice方法,但这会给予我一个Foo的切片,而不是&Foo的切片。

0md85ypi

0md85ypi1#

在向量Vec<T>上调用iter()方法将创建并返回一个&T上的迭代器。然后,您可以创建一个Vec<&T>并将对它的引用传递给my_func()。通过deref强制,可以将&Vec<&T>传递给需要&[&T]的函数。
下面是一个例子,为了简单起见,我使用了u64而不是Foo

fn my_func(arg: &[&u64]) {
    println!("arg = {arg:?}")    
}

fn main() {
    let records: Vec<u64> = vec![77, 33];
    let a: Vec<&u64> = records.iter().collect();
    my_func(&a);
}

还要注意这一行:

let a: Vec<&u64> = records.iter().collect();

可替换为以下任何一项:

let a: Vec<_> = records.iter().collect();
let a = records.iter().collect::<Vec<&u64>>();
let a = records.iter().collect::<Vec<_>>();

相关问题