区间选择 Range
ops
模块定义了几种区间选择的结构体, 以及 RangeBounds
trait.
Range 迭代器
用于定义一个左闭右开的区间, [start..end)
, 即 start <= x < end
, 如果 start >= end
,
就为空, 啥都不选.
其结构体定义如下:
#![allow(unused)] fn main() { pub struct Range<Idx> { pub start: Idx, pub end: Idx, } }
它用来支持 start..end
这种语法糖:
#![allow(unused)] fn main() { use std::ops::Range; assert_eq!((3..6), Range{ start: 3, end: 6 }); }
RangeFrom 迭代器
它的定义如下:
#![allow(unused)] fn main() { pub struct RangeFrom<Idx> { pub start: Idx, } }
它用来支持 start..
这种语法糖:
#![allow(unused)] fn main() { use std::ops::RangeFrom; assert_eq!((3..), RangeFrom { start: 3 }); }
要注意的是, 因为这个迭代器没有指定结束的值, 它可能会出现整数溢出的问题.
RangeFull 结构体
用于定义无边界区间, 然而它并不是一个迭代器, 它没有起始值.
它用来支持 ..
这种语法糖, 它用来选择一个 slice 里的所有元素.
#![allow(unused)] fn main() { let slice = [0, 1, 1, 2, 3]; assert_eq!(slice[..], [0, 1, 1, 2, 3]); }
RangeInclusive 迭代器
它用来支持 start..=end
这种语法糖:
#![allow(unused)] fn main() { use std::ops::RangeInclusive; assert_eq!((3..=6), RangeInclusive::new(3, 6)); }
RangeTo 结构体
它不是一个迭代码, 因为没有起始值, 用于 slice 里的部分元素.
它用来支持 ..end
这种语法糖:
#![allow(unused)] fn main() { use std::ops::RangeTo; assert_eq!((..6), RangeTo{ end: 6 }); }
RangeToInclusive 结构体
它不是一个迭代码, 因为没有起始值, 用于 slice 里的部分元素.
它用来支持 ..=end
这种语法糖:
#![allow(unused)] fn main() { use std::ops::RangeToInclusive; assert_eq!((..=6), RangeToInclusive{ end: 6 }); }