gpt4 book ai didi

rust - `Cloned` 迭代器适配器如何与 `Iterator` 一起工作?

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

为什么以下代码在 Cloned 时有效?期望一个 DoubleEndedIterator<Item=&'a T>但是iter()返回 Iterator<T> (而不是预期的 Iterator<&T>)?

use std::clone::Clone;
use std::iter::{Rev, Cloned};
use std::fmt::Debug;

fn reversed<'a, U, T>(iter: U) -> Rev<Cloned<U>>
where U: DoubleEndedIterator<Item=&'a T>,
T: 'a + Clone + Debug
{
iter.cloned().rev()
}

fn main() {
let v0 = (0..10).collect::<Vec<u32>>();
let mut v0r = v0.clone();
v0r.reverse();

assert_eq!(v0r, reversed(v0.iter()).collect::<Vec<_>>());
}

最佳答案

T是通用参数,它有一个适用范围。具体来说,T std::slice::Iter 的参数与T不同声明于 reversed .如果不是这样,我认为人类基本上不可能使用泛型。就像每个变量都称为 name指的是同一件事!

but iter() returns an Iterator<T>

这不是真的;您目前无法返回特征。您只能返回一个实现特征的类型。此外,std::slice::Iter<T>工具 Iterator通过返回对 T 的引用:

impl<'a, T> Iterator for Iter<'a, T> {
type Item = &'a T
}

关于rust - `Cloned` 迭代器适配器如何与 `Iterator<T>` 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36505268/

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