在 Rust 中,Range 表示一个区间,通常用于迭代和切片操作。Rust 提供了多种范围类型,各有不同的特性。
1.基本范围类型
a) 左闭右开范围start..end
// 包含 start,不包含 endforiin0..5{println!("{}",i);// 输出 0, 1, 2, 3, 4}b) 全闭范围start..=end
// 包含 start 和 endforiin0..=5{println!("{}",i);// 输出 0, 1, 2, 3, 4, 5}2.范围创建语法
letrange1=0..10;// Rangeletrange2=0..=10;// RangeInclusiveletrange3=..10;// RangeToletrange4=..=10;// RangeToInclusiveletrange5=5..;// RangeFromletrange6=..;// RangeFull3.范围的使用场景
a) 循环迭代
foriin1..=10{println!("Iteration {}",i);}for_in0..5{println!("重复5次");}b) 数组/切片切片
letarr=[0,1,2,3,4,5];letslice1=&arr[1..4];// [1, 2, 3]letslice2=&arr[..3];// [0, 1, 2]letslice3=&arr[2..];// [2, 3, 4, 5]letslice4=&arr[..];// 整个数组c) 模式匹配
letx=5;matchx{0..=5=>println!("0到5之间"),6..=10=>println!("6到10之间"),_=>println!("其他"),}4.范围的方法和特性
包含性检查
letrange=1..10;assert!(range.contains(&5));assert!(!range.contains(&10));letinclusive_range=1..=10;assert!(inclusive_range.contains(&10));范围运算
letr=0..10;println!("Start: {:?}",r.start);// 0println!("End: {:?}",r.end);// 10// 范围可以迭代foriin(0..10).step_by(2){println!("{}",i);// 0, 2, 4, 6, 8}5.自定义类型支持范围
usestd::ops::Range;// 为自定义类型实现 Index<Range<usize>>structMyVec(Vec<i32>);implstd::ops::Index<Range<usize>>forMyVec{typeOutput=[i32];fnindex(&self,index:Range<usize>)->&Self::Output{&self.0[index]}}6.范围和迭代器
范围实现了Iteratortrait:
letsum:i32=(1..=100).sum();println!("1到100的和: {}",sum);letevens:Vec<_>=(0..20).filter(|x|x%2==0).collect();7.范围边界类型
范围不仅限于整数:
letchar_range='a'..='z';forcinchar_range{print!("{} ",c);}// 浮点数不支持 Range(不能迭代),但可以用于比较letx=3.14;if(0.0..1.0).contains(&x){println!("在0到1之间");}8.实用技巧
反向范围
foriin(0..5).rev(){println!("{}",i);// 4, 3, 2, 1, 0}范围组合
letr1=0..10;letr2=5..15;// 范围可以比较assert!(r1.start<r2.start);范围模式匹配
fncheck_range(n:i32)->&'staticstr{matchn{i32::MIN..=-1=>"负数",0=>"零",1..=i32::MAX=>"正数",}}9.范围类型总结表
| 语法 | 类型 | 包含 start | 包含 end | 示例 |
|---|---|---|---|---|
a..b | Range | ✅ | ❌ | 0..5 |
a..=b | RangeInclusive | ✅ | ✅ | 0..=5 |
..b | RangeTo | ❌ | ❌ | ..5 |
..=b | RangeToInclusive | ❌ | ✅ | ..=5 |
a.. | RangeFrom | ✅ | ❌ | 5.. |
.. | RangeFull | ❌ | ❌ | .. |
10.常见陷阱
// 注意:范围是左闭右开的foriin0..0{// 这里不会执行!}// 反向范围需要明确的起点和终点foriin(5..=1).rev(){// 错误:5..=1 是空范围// 正确的做法:// for i in (1..=5).rev()}总结
Rust 的范围系统提供了:
- 类型安全:编译时检查范围有效性
- 灵活性:多种范围类型满足不同需求
- 高性能:零成本抽象
- 可组合性:可与迭代器等方法链式调用
范围是 Rust 中非常实用的特性,特别适合处理序列、循环和切片操作。