Rust中的链向量和迭代元素

Rust中的链向量和迭代元素,rust,iterator,Rust,Iterator,我想用Rust编写一个函数,返回由起始整数、所有中间整数和结束整数组成的向量。它应该持有的主张是: assert_eq!(intervals(0, 4, 1..4), vec![0, 1, 2, 3, 4]); 提示是对迭代器使用chain方法。函数声明是预定义的,我用一种方式实现了它,即以下代码: pub fn intervals< I>(start: u32, end: u32, intermediate: I) -> Vec<u32> where I

我想用Rust编写一个函数,返回由起始整数、所有中间整数和结束整数组成的向量。它应该持有的主张是:

assert_eq!(intervals(0, 4, 1..4), vec![0, 1, 2, 3, 4]);
提示是对迭代器使用chain方法。函数声明是预定义的,我用一种方式实现了它,即以下代码:

pub fn intervals< I>(start: u32, end: u32, intermediate: I) -> Vec<u32>
where
    I: IntoIterator<Item = u32>,
{
    let mut a1 = vec![];
    a1.push(start);

    let inter: Vec<u32> = intermediate.into_iter().collect();
    let mut iter : Vec<u32> = a1.iter().chain(inter.iter()).map(|x| *x).collect();

    iter.push(end);
    return iter;
}
但我确信这并不是最好的方法。我确信我在中间的两句话里做了很多不必要的事情。我试着直接使用intermediate,如下所示:

let mut iter: Vec<u32> = a1.iter().chain(intermediate).map(|x| *x).collect();
但是我得到了链式方法的这个错误,我不知道如何解决它:

type mismatch resolving <I as std::iter::IntoIterator>::Item==&u32, 
expected u32, found &u32
我是超级新手,所以任何建议都将有助于理解使用中间参数的正确方法

以下是一些提示:

您已经创建了三个单独的向量,一个显式创建,两个使用collect创建,而实际上您只需要一个。 可以使用迭代器为开始整数和结束整数生成迭代器 不需要收集中间范围。中间参数实现IntoIterator,因此您可以直接将其提供给。因此,您可以将开始、中间和结束链接在一起。 无需在函数末尾使用“return”关键字-只要函数末尾没有分号,函数的结果就是其中最后一个表达式的值。 应用这些提示,您的函数将如下所示:

use std::iter::once;

pub fn intervals< I>(start: u32, end: u32, intermediate: I) -> Vec<u32>
where
    I: IntoIterator<Item = u32>,
{
    once(start).chain(intermediate).chain(once(end)).collect()
}
let mut iter : Vec<u32> = a1.into_iter().chain(intermediate).collect();
以下是一些提示:

您已经创建了三个单独的向量,一个显式创建,两个使用collect创建,而实际上您只需要一个。 可以使用迭代器为开始整数和结束整数生成迭代器 不需要收集中间范围。中间参数实现IntoIterator,因此您可以直接将其提供给。因此,您可以将开始、中间和结束链接在一起。 无需在函数末尾使用“return”关键字-只要函数末尾没有分号,函数的结果就是其中最后一个表达式的值。 应用这些提示,您的函数将如下所示:

use std::iter::once;

pub fn intervals< I>(start: u32, end: u32, intermediate: I) -> Vec<u32>
where
    I: IntoIterator<Item = u32>,
{
    once(start).chain(intermediate).chain(once(end)).collect()
}
let mut iter : Vec<u32> = a1.into_iter().chain(intermediate).collect();

非常感谢,我得到了你们的观点,你们建议的解决方案似乎比我的代码更理想。是否也可以解释为什么尝试这样做:a1.iter.chainintermediate会在chain方法中出现错误:类型不匹配解析?因为我认为这应该像oncestart一样提供迭代器,不是吗?@AnaKhorguani的答案已经更新,以解决您的问题。啊,我现在明白了。非常感谢:非常感谢,我得到了你们的观点,你们建议的解决方案似乎比我的代码更理想。是否也可以解释为什么尝试这样做:a1.iter.chainintermediate会在chain方法中出现错误:类型不匹配解析?因为我认为这应该像oncestart一样提供迭代器,不是吗?@AnaKhorguani的答案已经更新,以解决您的问题。啊,我现在明白了。非常感谢你: