rust学习~slice迭代器

本文详细介绍了Rust中Slice迭代器的使用,包括Iter、DoubleEndedIterator、ExactSizeIterator和FusedIterator的区别和功能。重点讨论了Sum Trait在求和中的作用,以及不同迭代器如何在迭代、大小确定和耗尽状态方面提供不同能力。通过实例解析,帮助理解在实际编程中如何选择合适的迭代器。
摘要由CSDN通过智能技术生成

背景

pub fn iter(&self) -> Iter<'_, T>

查看Iter

结构体

pub struct Iter<'a, T>
where
    T: 'a,
{
    /* private fields */ }

对迭代器求和 sum

fn sum<S>(self) -> S
where
    Self: Sized, // 该函数只能在具有已知大小的类型上调用
    S: Sum<Self::Item>, // 指定和的类型,要求和的类型必须实现了 Sum trait

该函数返回 self 中所有项的和

  • Self 上的 Sized trait bound 表示该函数只能在具有已知大小的类型上调用,即只能在编译时确定大小的类型上调用该函数。
  • S 类型参数用于指定和的类型,而且要求和的类型必须实现了 Sum trait(这个 trait 用于进行求和操作)。

求和中的Sum Trait

std::iter::Sum
pub trait Sum<A = Self>: Sized {
   
    // Required method
    fn sum<I>(iter: I) -> Self
       where I: Iterator<Item = A>;
}

查看int32的Sum实现

// i32 的实现中,实现了如下trait
impl Sum<i32> for i32

fn sum<I>(iter: I) -> i32
where
    I: Iterator<Item = i32>,

阅读代码

// 具体实现方式
// 一个宏,它接受一系列整数类型作为参数,并为每个整数类型生成函数
// 这些函数可以计算相应整数类型的一组数字的和与积
integer_sum_product! {
    i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize }

// 宏的详细代码
// 为一系列整数类型实现 Sum 和 Product trait
macro_rules! integer_sum_product {
   
    // @impls 部分
    // 它是一个递归宏,用于为每个整数类型生成函数的实现
    // @impls 部分以两个参数 $zero 和 $one 开头,这两个参数分别是求和和求积操作的初始值
    // #[$attr:meta] 是一个标识求和和求积方法稳定性的元数据。这部分可以根据具体需求进行修改或省略
    // 为每个整数类型 $a 生成 Sum trait 的实现,初始值为 $zero
    // 为每个整数类型 $a 生成 Product trait 的实现,初始值为 $one
    (@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($(
        #[$attr]
        impl Sum for $a {
   
            fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
   
                // sum 方法的实现使用了 fold 方法来迭代累积计算和
                // 初始值为 $zero
                // 并在每次迭代中使用 #[rustc_inherit_overflow_checks] 注解来进行溢出检查
                // 迭代时,进行求和
                iter.fold(
                    $zero,
                    #[rustc_inherit_overflow_checks]
                    |a, b| a + b,
                )
            }
        }

        #[$attr]
        impl Product for $a {
   
            fn product<I: Iterator<Item=Self>>(iter: I) -> Self {
   
                iter.fold(
                    $one,
                    #[rustc_inherit_overflow_checks]
                    |a, b| a * b,
                )
            }
        }

        // 为引用类型生成的实现,允许对 &Self 进行求和
        #[$attr]
        impl<'a> Sum<&'a $a> for $a {
   
            fn sum<I: Iterator<Item=&'a Self>>(iter: I) -> Self {
   
                iter.fold(
                    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值