前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust IntoIterator与Iterator区别

Rust IntoIterator与Iterator区别

原创
作者头像
路之遥
发布于 2025-05-06 15:28:44
发布于 2025-05-06 15:28:44
670
举报
文章被收录于专栏:luzhiyaoluzhiyao

Rust 中IntoIterator和Iterator是2个密切相关但用途不同的trait,顾名思义IntoIterator用于从某个类型创建Iterator.

Trait

作用

用法

示例

Iterator

定义了迭代器的行为,如何获取下一个元素

.next()

vec.iter()

IntoIterator

从一个类型获取迭代器,定义了可以变成迭代器的类型

.into_iter()

for x in vec

IntoIterator 定义

代码语言:rust
AI代码解释
复制
pub trait IntoIterator {
    type Item;
    type IntoIter: Iterator<Item = Self::Item>;

    fn into_iter(self) -> Self::IntoIter;
}

由定义可看到,into_iter是将原始类型的所有权转移给创建的迭代器,所以into_iter调用完成后原始变量将无法再使用。

for 语法糖

当用for循环迭代元素时,rust 插入语法糖简化用户写法。

代码语言:rust
AI代码解释
复制
// ------------语法糖-----------
let v = vec![1,2,3];
for x in v{ .....}

// ------------ 等价于 -----------
for x in v.into_iter{ ......}

// ------------或者等价于 -----------
for x in IntoIterator::into_iter(v){ ........ }

为实现Iterator的类型 实现 IntoIterator

同时 Rust 标准库中提供了一个blanket实现,为任何实现Iterator的类型自动实现IntoIterator trait.

但这个实现的适用范围有限,主要适用于迭代器本身,而非容器类型。

代码语言:rust
AI代码解释
复制
impl<I: Iterator> IntoIterator for I {
    type Item = I::Item;
    type IntoIter = I;

    #[inline]
    fn into_iter(self) -> I {
        self
    }
}

示例

定义一个容器类型:MyCollection,一个对应的迭代器类型:MyCollectionIter

代码语言:rust
AI代码解释
复制
struct MyCollection {
    items: Vec<String>,
}

struct MyCollectionIter {
    index: usize,
    items: Vec<String>, 
}

impl MyCollectionIter{
    fn new(v: MyCollection) -> Self{
        MyCollectionIter{
            index: 0,
            items: v.items,
        }
    }
}

为迭代器类型(MyCollectionIter)实现next方法

代码语言:rust
AI代码解释
复制
impl Iterator for MyCollectionIter {
    type Item = String;

    fn next(&mut self) -> Option<Self::Item> {
        if self.index < self.items.len() {
            let item = self.items[self.index].clone(); 
            self.index += 1;
            Some(item)
        } else {
            None
        }
    }
}

为容器类型实现IntoIterator,即如何从容器类型(MyCollection)生成它对应的迭代器类型(MyCollectionIter)

代码语言:rust
AI代码解释
复制
impl IntoIterator for MyCollection {
    type Item = String;
    type IntoIter = MyCollectionIter;

    fn into_iter(self) -> Self::IntoIter {
        MyCollectionIter::new(self)
    }
}

调用示例与非语法糖的手动实现

代码语言:rust
AI代码解释
复制
// ------------ 语法糖 for-----------
fn main() {
    let collection = MyCollection {
        items: vec!["one".to_string(), "two".to_string(), "three".to_string()],
    };

    for item in collection {
        println!("Item: {}", item);
    }
}

// ------------ 手动实现 -----------
fn main() {
    let collection = MyCollection {
        items: vec!["one".to_string(), "two".to_string(), "three".to_string()],
    };
    
    let iter = collection.into_iter();
    while let Some(item) in iter.next()  {
        println!("Item: {}", item);
    }
}

Iterator 定义

大多数情况下实现自定义Iterator时仅需要实现next方法,Iterator剩余的其他方法标准库提供默认blanket实现;

代码语言:rust
AI代码解释
复制
pub trait Iterator {
    type Item;

    fn next(&mut self) -> Option<Self::Item>;
    
    ....
    剩余的trait内方法已提供默认实现,通常情况下不用覆盖这些实现
}

自定义类型的实现示例参见上面类型定义:MyCollectionIter

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • IntoIterator 定义
    • for 语法糖
    • 为实现Iterator的类型 实现 IntoIterator
  • Iterator 定义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档