gpt4 book ai didi

rust - 如何构建并传递迭代器的迭代器?

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

我试图通过在其中实现简单的算法来理解 Rust。我设法制作了一个通用的 merge_sorted,它最终具有以下签名:

fn merge_sorted<IL, ILL, I: Ord>(mut arrays: ILL) -> Vec<I>
where
IL: Iterator<Item = I>,
ILL: Iterator<Item = IL>,
{
// ...
}

这似乎是自行编译的。签名对我来说很有意义,因为函数使用顶级迭代器,以及它返回的所有迭代器。但是,我无法构建传递给此函数的有效值:

fn main() {
let v1 = vec![1, 2];
let vectors = vec![v1.iter()];
merge_sorted(vectors.iter());
}

正如预期的那样,此示例中的vectors 具有以下类型:

std::vec::Vec<std::slice::Iter<'_, i32>>

这是我收到的错误信息:

error[E0277]: the trait bound `&std::slice::Iter<'_, {integer}>: std::iter::Iterator` is not satisfied
--> src\main.rs:58:5
|
58 | merge_sorted(vectors.iter());
| ^^^^^^^^^^^^ `&std::slice::Iter<'_, {integer}>` is not an iterator; maybe try calling `.iter()` or a similar method
|
= help: the trait `std::iter::Iterator` is not implemented for `&std::slice::Iter<'_, {integer}>`
note: required by `merge_sorted`

& 从何而来?

最佳答案

Vec::iter 借用 它包含的项目,因此您正在迭代借用的迭代器 (&std::slice::Iter)不实现 Iterator。要使用向量以获得项的所有权,您必须调用 Vec::into_iter:

fn main() {
let v1 = vec![1, 2];
let vectors = vec![v1.iter()]; // You can use `into_iter` there to iterate over ints.
merge_sorted(vectors.into_iter());
}

您还可以要求 IntoIterators 来简化 API 的使用:

fn merge_sorted<IterT, IterIterT, T: Ord>(mut arrays: IterIterT) -> Vec<T>
where
IterT: IntoIterator<Item = T>,
IterIterT: IntoIterator<Item = IterT>,
{
panic!();
}

fn main() {
let v1 = vec![1, 2];
let vectors = vec![v1];
merge_sorted(vectors);
}

关于rust - 如何构建并传递迭代器的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53176209/

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