gpt4 book ai didi

rust - 如何最普遍地迭代具有给定类型的一系列项目?

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

下面的代码最能说明问题。

use std::iter::IntoIterator;

fn iterate<I: IntoIterator<Item=String>>(v: I) {
}

// iterate(&["foo".to_string()])
// error: type mismatch resolving `<&[collections::string::String; 1] as core::iter::IntoIterator>::Item == collections::string::String`:
// expected &-ptr,
// found struct `collections::string::String` [E0271]

// iterate(["foo".to_string()].iter())
// type mismatch resolving `<core::slice::Iter<'_, collections::string::String> as core::iter::IntoIterator>::Item == collections::string::String`:
// expected &-ptr,
// found struct `collections::string::String` [E0271]

// This works !
iterate(vec!["foo".to_string()])

我如何一般地迭代任何东西(具有给定的项目类型)?

附加说明

目的是允许此类函数的用户传入任何可以迭代或转换为迭代器的内容。

另外我觉得编译器错误中并没有真正描述实际问题 - 因为它看到的类型似乎与它显示的不同。

我正在使用 rustc 1.0.0-nightly (522d09dfe 2015-02-19)(内置于 2015-02-19)

最佳答案

让我们看看第一个案例的类型是什么:

for i in &["foo".to_string()] {
let () = i;
// expected `&collections::string::String`,
// found `()`
}

也就是说,你的迭代变量的类型是&String , String ,正如您的功能所希望的那样。你的第二个案例也会发生同样的事情。第三种情况有效:

for i in vec!["foo".to_string()] {
let () = i;
// expected `collections::string::String`,
// found `()`
}

我们可以看看 IntoIter 的实现对于 arraysall 3 forms of Vec .请注意 Vec<T> 的实现消耗 向量,而 &Vec<T> 的向量必须返回对元素的引用的迭代器。

您不能使用数组,因此迭代器必须始终返回引用。

这是一个使用 AsRef 的示例应该做你想做的特质:

use std::iter::IntoIterator;

fn iterate<I, S>(v: I)
where I: IntoIterator<Item=S>,
S: AsRef<str>
{}

fn main() {
iterate(&["foo"]);
iterate(&["foo".to_string()]);
iterate(["foo".to_string()].iter());
iterate(vec!["foo".to_string()]);
iterate(&vec!["foo".to_string()]);
}

这表示我们期望任何实现特征 Iterator 的具体类型.该迭代器必须产生一个实现特征 AsRef<str> 的类型,允许我们传入 {String 的 {arrays,vectors,slices} , &str }.

关于rust - 如何最普遍地迭代具有给定类型的一系列项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649466/

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