Rust错误处理
Rust 错误处理Rust 有一套独特的处理异常情况的机制,它并不像其它语言中的 try 机制那样简单。首先,程序中一般会出现两种错误:可恢复错误和不可恢复错误。可恢复错误的典型案例是文件访问错误,如果访问一个文件失败,有可能是因为它正在被占用,是正常的,我们可以通过等待来解决。但还有一种错误是由编程中无法解决的逻辑错误导致的,例如访问数组末尾以外的位置。大多数编程语言不区分这两种错误,并用 Exception (异常)类来表示错误。在 Rust 中没有 Exception。对于可恢复错误用 Result<T, E> 类来处理,对于不可恢复错误使用 panic! 宏来处理。不可恢复错误本章以前没有专门介绍 Rust 宏的语法,但已经使用过了 println! 宏,因为这些宏的使用较为简单,所以暂时不需要彻底掌握它,我们可以用同样的方法先学会使用 panic! 宏的使用方法。实例fn main() { panic!(“error occured”); println!(“Hello, Rust”);} 运行结果:thread ‘main’ panicked...
Rust闭包
Rust 闭包 Rust 中的闭包是一种匿名函数,它们可以捕获并存储其环境中的变量。闭包允许在其定义的作用域之外访问变量,并且可以在需要时将其移动或借用给闭包。闭包在 Rust 中被广泛应用于函数式编程、并发编程和事件驱动编程等领域。 闭包在 Rust 中非常有用,因为它们提供了一种简洁的方式来编写和使用函数。闭包在 Rust 中非常灵活,可以存储在变量中、作为参数传递,甚至作为返回值。闭包通常用于需要短小的自定义逻辑的场景,例如迭代器、回调函数等。闭包与函数的区别特性闭包函数匿名性是匿名的,可存储为变量有固定名称环境捕获可以捕获外部变量不能捕获外部变量定义方式`参数类型推导参数和返回值类型可以推导必须显式指定存储与传递可以作为变量、参数、返回值同样支持 以下是 Rust 闭包的一些关键特性和用法:闭包的声明闭包的语法声明:let closure_name = |参数列表| 表达式或语句块;参数可以有类型注解,也可以省略,Rust 编译器会根据上下文推断它们。let add_one = |x: i32| x +...
Rust集合与字符串
Rust 集合与字符串集合(Collection)是数据结构中最普遍的数据存放形式,Rust 标准库中提供了丰富的集合类型帮助开发者处理数据结构的操作。向量向量(Vector)是一个存放多值的单数据结构,该结构将相同类型的值线性的存放在内存中。向量是线性表,在 Rust 中的表示是 Vec。向量的使用方式类似于列表(List),我们可以通过这种方式创建指定类型的向量:let vector: Vec = Vec::new(); // 创建类型为 i32 的空向量let vector = vec![1, 2, 4, 8]; // 通过数组创建向量我们使用线性表常常会用到追加的操作,但是追加和栈的 push 操作本质是一样的,所以向量只有 push 方法来追加单个元素:实例fn main() { let mut vector = vec![1, 2, 4, 8]; vector.push(16); vector.push(32); vector.push(64); ...
Rust迭代器
Rust 迭代器 Rust 中的迭代器(Iterator)是一个强大且灵活的工具,用于对集合(如数组、向量、链表等)进行逐步访问和操作。Rust 的迭代器是惰性求值的,这意味着迭代器本身不会立即执行操作,而是在你需要时才会产生值。迭代器允许你以一种声明式的方式来遍历序列,如数组、切片、链表等集合类型的元素。迭代器背后的核心思想是将数据处理过程与数据本身分离,使代码更清晰、更易读、更易维护。 在 Rust 中,迭代器通过实现 Iterator trait 来定义。最基本的 trait 方法是 next,用于逐一返回迭代器中的下一个元素,直到返回 None 表示结束。实例pub trait Iterator { type Item; fn next(&mut self) -> OptionSelf::Item; // 其他默认实现的方法如 map, filter 等。} 迭代器遵循以下原则: 惰性求值 (Laziness):Rust...
Rust结构体
Rust 结构体Rust 中的结构体(Struct)与元组(Tuple)都可以将若干个类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它成员的时候就不用记住下标了。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫做”字段”。结构体定义这是一个结构体定义:struct Site { domain: String, name: String, nation: String, found: u32}注意:如果你常用 C/C++,请记住在 Rust 里 struct 语句仅用来定义,不能声明实例,结尾不需要 ; 符号,而且每个字段定义之后用 , 分隔。结构体实例Rust 很多地方受 JavaScript 影响,在实例化结构体的时候用 JSON 对象的 key: value...
Rust组织管理
Rust 组织管理任何一门编程语言如果不能组织代码都是难以深入的,几乎没有一个软件产品是由一个源文件编译而成的。本教程到目前为止所有的程序都是在一个文件中编写的,主要是为了方便学习 Rust 语言的语法和概念。对于一个工程来讲,组织代码是十分重要的。Rust 中有三个重要的组织概念:箱、包、模块。箱(Crate)“箱”是二进制程序文件或者库文件,存在于”包”中。“箱”是树状结构的,它的树根是编译器开始运行时编译的源文件所编译的程序。注意:”二进制程序文件”不一定是”二进制可执行文件”,只能确定是是包含目标机器语言的文件,文件格式随编译环境的不同而不同。包(Package)当我们使用 Cargo 执行 new 命令创建 Rust 工程时,工程目录下会建立一个 Cargo.toml 文件。工程的实质就是一个包,包必须由一个 Cargo.toml 文件来管理,该文件描述了包的基本信息以及依赖项。一个包最多包含一个库”箱”,可以包含任意数量的二进制”箱”,但是至少包含一个”箱”(不管是库还是二进制”箱”)。当使用 cargo new 命令创建完包之后,src 目录下会生成一个...
Rust生命周期
Rust 生命周期Rust 生命周期机制是与所有权机制同等重要的资源管理机制。之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。引用是对待复杂类型时必不可少的机制,毕竟复杂类型的数据不能被处理器轻易地复制和计算。但引用往往导致极其复杂的资源管理问题,首先认识一下垂悬引用:实例{ let r; { let x = 5; r = &x; } println!(“r: {}”, r);} 这段代码是不会通过 Rust 编译器的,原因是 r 所引用的值已经在使用之前被释放。 上图中的绿色范围 ‘a 表示 r 的生命周期,蓝色范围 ‘b 表示 x 的生命周期。很显然,’b 比 ‘a 小得多,引用必须在值的生命周期以内才有效。一直以来我们都在结构体中使用 String 而不用 &str,我们用一个案例解释原因:实例fn longer(s1: &str, s2: &str) -> &str { if s2.len() > s1.len() { ...
Rust环境搭建
Rust 环境搭建Rust 支持很多的集成开发环境(IDE)或开发专用的文本编辑器。 官方网站公布支持的工具如下(https://www.rust-lang.org/zh-CN/tools): 本教程将使用 Visual Studio Code 作为我们的开发环境(Eclipse 有专用于 Rust 开发的版本,对于初学者也是不错的选择)。 注意:IntelliJ IDEA 安装插件之后难以调试,所以推荐习惯使用 IDEA 的开发者使用 CLion,但 CLion 不是免费的。 搭建 Visual Studio Code 开发环境 首先,需要安装最新版的 Rust 编译工具和 Visual Studio Code。Rust 编译工具:https://www.rust-lang.org/zh-CN/tools/installVisual Studio Code:https://code.visualstudio.com/Download Rust 的编译工具依赖 C 语言的编译工具,这意味着你的电脑上至少已经存在一个 C 语言的编译环境。如果你使用的是 Linux...
Rust注释
Rust 注释Rust 中的注释方式与其它语言(C、Java)一样,支持两种注释方式:实例// 这是第一种注释方式 /* 这是第二种注释方式 */ /* * 多行注释 * 多行注释 * 多行注释 */ 用于说明文档的注释在 Rust 中使用 // 可以使其之后到第一个换行符的内容变成注释。在这种规则下,三个正斜杠 /// 依然是合法的注释开始。所以 Rust 可以用 /// 作为说明文档注释的开头:实例/// Adds one to the number given.////// # Examples////// /// let x = add(1, 2); /// /// fn add(a: i32, b: i32) -> i32 { return a +...
Rust泛型与特性
Rust 泛型与特性泛型是一个编程语言不可或缺的机制。C++ 语言中用”模板”来实现泛型,而 C 语言中没有泛型的机制,这也导致 C...