【Rust】范围 Range详解

在 Rust 中,Range 表示一个区间,通常用于迭代和切片操作。Rust 提供了多种范围类型,各有不同的特性。

1. 基本范围类型

a) 左闭右开范围 start..end

rust 复制代码
// 包含 start,不包含 end
for i in 0..5 {
    println!("{}", i); // 输出 0, 1, 2, 3, 4
}

b) 全闭范围 start..=end

rust 复制代码
// 包含 start 和 end
for i in 0..=5 {
    println!("{}", i); // 输出 0, 1, 2, 3, 4, 5
}

2. 范围创建语法

rust 复制代码
let range1 = 0..10;        // Range
let range2 = 0..=10;       // RangeInclusive
let range3 = ..10;         // RangeTo
let range4 = ..=10;        // RangeToInclusive
let range5 = 5..;          // RangeFrom
let range6 = ..;           // RangeFull

3. 范围的使用场景

a) 循环迭代

rust 复制代码
for i in 1..=10 {
    println!("Iteration {}", i);
}

for _ in 0..5 {
    println!("重复5次");
}

b) 数组/切片切片

rust 复制代码
let arr = [0, 1, 2, 3, 4, 5];
let slice1 = &arr[1..4];    // [1, 2, 3]
let slice2 = &arr[..3];     // [0, 1, 2]
let slice3 = &arr[2..];     // [2, 3, 4, 5]
let slice4 = &arr[..];      // 整个数组

c) 模式匹配

rust 复制代码
let x = 5;
match x {
    0..=5 => println!("0到5之间"),
    6..=10 => println!("6到10之间"),
    _ => println!("其他"),
}

4. 范围的方法和特性

包含性检查

rust 复制代码
let range = 1..10;
assert!(range.contains(&5));
assert!(!range.contains(&10));

let inclusive_range = 1..=10;
assert!(inclusive_range.contains(&10));

范围运算

rust 复制代码
let r = 0..10;
println!("Start: {:?}", r.start); // 0
println!("End: {:?}", r.end);     // 10

// 范围可以迭代
for i in (0..10).step_by(2) {
    println!("{}", i); // 0, 2, 4, 6, 8
}

5. 自定义类型支持范围

rust 复制代码
use std::ops::Range;

// 为自定义类型实现 Index<Range<usize>>
struct MyVec(Vec<i32>);

impl std::ops::Index<Range<usize>> for MyVec {
    type Output = [i32];
    
    fn index(&self, index: Range<usize>) -> &Self::Output {
        &self.0[index]
    }
}

6. 范围和迭代器

范围实现了 Iterator trait:

rust 复制代码
let sum: i32 = (1..=100).sum();
println!("1到100的和: {}", sum);

let evens: Vec<_> = (0..20).filter(|x| x % 2 == 0).collect();

7. 范围边界类型

范围不仅限于整数:

rust 复制代码
let char_range = 'a'..='z';
for c in char_range {
    print!("{} ", c);
}

// 浮点数不支持 Range(不能迭代),但可以用于比较
let x = 3.14;
if (0.0..1.0).contains(&x) {
    println!("在0到1之间");
}

8. 实用技巧

反向范围

rust 复制代码
for i in (0..5).rev() {
    println!("{}", i); // 4, 3, 2, 1, 0
}

范围组合

rust 复制代码
let r1 = 0..10;
let r2 = 5..15;

// 范围可以比较
assert!(r1.start < r2.start);

范围模式匹配

rust 复制代码
fn check_range(n: i32) -> &'static str {
    match n {
        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. 常见陷阱

rust 复制代码
// 注意:范围是左闭右开的
for i in 0..0 {
    // 这里不会执行!
}

// 反向范围需要明确的起点和终点
for i in (5..=1).rev() {  // 错误:5..=1 是空范围
    // 正确的做法:
    // for i in (1..=5).rev()
}

总结

Rust 的范围系统提供了:

  • 类型安全:编译时检查范围有效性
  • 灵活性:多种范围类型满足不同需求
  • 高性能:零成本抽象
  • 可组合性:可与迭代器等方法链式调用

范围是 Rust 中非常实用的特性,特别适合处理序列、循环和切片操作。

相关推荐
鸿乃江边鸟4 小时前
Spark Datafusion Comet 向量化Rust Native--创建Datafusion计划
rust·spark·native
咸甜适中4 小时前
rust的docx-rs库,自定义docx模版批量分页生成一个docx文档(方便打印)(逐行注释)
rust·办公自动化·docx-rs
Vallelonga4 小时前
Rust Option.as_ref() 方法
开发语言·rust
大卫小东(Sheldon)19 小时前
GIM 2.0 发布:真正让 AI 提交消息可定制、可控、可项目级优化
git·rust·gim
roamingcode1 天前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot
初恋叫萱萱1 天前
构建高性能生成式AI应用:基于Rust Axum与蓝耘DeepSeek-V3.2大模型服务的全栈开发实战
开发语言·人工智能·rust
superman超哥3 天前
Serde 性能优化的终极武器
开发语言·rust·编程语言·rust serde·serde性能优化·rust开发工具
sayang_shao3 天前
Rust多线程编程学习笔记
笔记·学习·rust
鸿乃江边鸟3 天前
Spark Datafusion Comet 向量化Rust Native--读数据
rust·spark·native·arrow
硬汉嵌入式3 天前
基于Rust构建的单片机Ariel RTOS,支持Cortex-M、RISC-V 和 Xtensa
单片机·rust·risc-v