gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:45:01 30 4
gpt4 key购买 nike

我开始使用 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

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

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

但现在是:

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

否则,我会收到以下错误:

error: the trait `core::marker::Sized` is not implemented for the type
`[collections::string::String]` [E0277]

所以我想知道是否有一种方法可以将 Iterator 转换为 slice 或避免必须在此指定 collected 类型具体案例。

最佳答案

So I wonder if there is a way to convert an Iterator to a slice

没有。

迭代器一次只提供一个元素,而切片是一次获取多个元素。这就是为什么您首先需要将 Iterator 生成的所有元素收集到一个连续数组 (Vec) 中,然后才能使用切片。

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

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

另一种选择是让 function 取而代之的是 Iterator(以及引用的迭代器):

let names = args.arguments.iter().map(|arg| &arg.name);
function(names);

毕竟,迭代器更通用,如果需要,你总是可以在函数内部“实现”切片。

关于rust - 如何从迭代器中获取切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189227/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com