如何从迭代器中获取切片?

ant*_*oyo 8 rust

我开始使用clippy作为linter.有时,它会显示此警告:

writing `&Vec<_>` instead of `&[_]` involves one more reference and cannot be
used with non-Vec-based slices. Consider changing the type to `&[...]`,
#[warn(ptr_arg)] on by default
Run Code Online (Sandbox Code Playgroud)

我将参数更改为切片,但这会在调用端添加样板.例如,代码是:

let names = args.arguments.iter().map(|arg| {
    arg.name.clone()
}).collect();
function(&names);
Run Code Online (Sandbox Code Playgroud)

但现在是:

let names = args.arguments.iter().map(|arg| {
    arg.name.clone()
}).collect::<Vec<_>>();
function(&names);
Run Code Online (Sandbox Code Playgroud)

否则,我收到以下错误:

error: the trait `core::marker::Sized` is not implemented for the type
`[collections::string::String]` [E0277]
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有办法将a转换Iterator为a slice或避免collect在这种特定情况下必须指定ed类型.

Mat*_* M. 19

所以我想知道是否有办法将Iteratora 转换为aslice

那没有.

迭代器一次只提供一个元素,而切片一次只提供几个元素.这就是为什么在能够使用切片之前首先需要将所有由元素生成的元素收集Iterator到一个连续的数组(Vec)中.

第一个明显的答案是不要担心轻微的开销,虽然我个人更喜欢将类型提示放在变量旁边(我发现它更具可读性):

let names: Vec<_> = args.arguments.iter().map(|arg| {
    arg.name.clone()
}).collect();
function(&names);
Run Code Online (Sandbox Code Playgroud)

另一种选择将是function采取一种Iterator代替(和引用的迭代器,在那个):

let names = args.arguments.iter().map(|arg| &arg.name);
function(names);
Run Code Online (Sandbox Code Playgroud)

毕竟,迭代器更通用,如果需要,您可以随时"实现"函数内部的切片.