假设我在Vec中有一些结构体示例:
let records: Vec<Foo> = ...;
我需要将它们与一个函数一起使用,该函数将引用切片作为参数:
fn my_func(arg: &[&Foo]) { ... }
如何从Vec中获取引用的切片?我看到有一个as_slice方法,但这会给予我一个Foo的切片,而不是&Foo的切片。
as_slice
Foo
&Foo
0md85ypi1#
在向量Vec<T>上调用iter()方法将创建并返回一个&T上的迭代器。然后,您可以创建一个Vec<&T>并将对它的引用传递给my_func()。通过deref强制,可以将&Vec<&T>传递给需要&[&T]的函数。下面是一个例子,为了简单起见,我使用了u64而不是Foo:
Vec<T>
iter()
&T
Vec<&T>
my_func()
&Vec<&T>
&[&T]
u64
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<_>>();
1条答案
按热度按时间0md85ypi1#
在向量
Vec<T>
上调用iter()
方法将创建并返回一个&T
上的迭代器。然后,您可以创建一个Vec<&T>
并将对它的引用传递给my_func()
。通过deref强制,可以将&Vec<&T>
传递给需要&[&T]
的函数。下面是一个例子,为了简单起见,我使用了
u64
而不是Foo
:还要注意这一行:
可替换为以下任何一项: