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...
Rust枚举类
Rust 枚举类枚举类在 Rust 中并不像其他编程语言中的概念那样简单,但依然可以十分简单的使用:实例#[derive(Debug)] enum Book { Papery, Electronic} fn main() { let book = Book::Papery; println!(“{:?}”, book);} 运行结果:Papery书分为纸质书(Papery book)和电子书(Electronic book)。如果你现在正在开发一个图书管理系统,你需要描述两种书的不同属性(纸质书有索书号,电子书只有 URL),你可以为枚举类成员添加元组属性描述: enum Book { Papery(u32), Electronic(String),} let book = Book::Papery(1001);let ebook = Book::Electronic(String::from(“url://…”)); 如果你想为属性命名,可以用结构体语法:enum Book { Papery...
Rust条件语句
Rust 条件语句 在 Rust 语言中的条件语句是这种格式的:实例fn main() { let number = 3; if number < 5 { println!(“条件为 true”); } else { println!(“条件为 false”); }} 在上述程序中有条件 if 语句,这个语法在很多其它语言中很常见,但也有一些区别:首先,条件表达式 number < 5 不需要用小括号包括(注意,不需要不是不允许);但是 Rust 中的 if 不存在单语句不用加 {} 的规则,不允许使用一个语句代替一个块。尽管如此,Rust 还是支持传统 else-if 语法的:实例fn main() { let a = 12; let b; if a > 0 { b = 1; } else if a < 0 { b = -1; } else { b =...
Rust智能指针
Rust 智能指针智能指针(Smart pointers)是一种在 Rust 中常见的数据结构,它们提供了额外的功能和安全性保证,以帮助管理内存和数据。在 Rust 中,智能指针是一种封装了对动态分配内存的所有权和生命周期管理的数据类型。智能指针通常封装了一个原始指针,并提供了一些额外的功能,比如引用计数、所有权转移、生命周期管理等。在 Rust 中,标准库提供了几种常见的智能指针类型,例如 Box、Rc、Arc 和 RefCell。智能指针的使用场景: 当需要在堆上分配内存时,使用 Box。当需要多处共享所有权时,使用 Rc 或 Arc。当需要内部可变性时,使用 RefCell。当需要线程安全的共享所有权时,使用 Arc。当需要互斥访问数据时,使用 Mutex。当需要读取-写入访问数据时,使用 RwLock。当需要解决循环引用问题时,使用 Weak。 Box 智能指针Box 是 Rust 中最简单的智能指针之一,它允许在堆上分配一块内存,并将值存储在这个内存中。由于 Rust 的所有权规则,使用 Box 可以在堆上创建具有已知大小的数据。实例let b =...
Rust文件与IO
Rust 文件与 IO本章介绍 Rust 语言的 I/O 操作。接收命令行参数命令行程序是计算机程序最基础的存在形式,几乎所有的操作系统都支持命令行程序并将可视化程序的运行基于命令行机制。命令行程序必须能够接收来自命令行环境的参数,这些参数往往在一条命令行的命令之后以空格符分隔。在很多语言中(如 Java 和 C/C++)环境参数是以主函数的参数(常常是一个字符串数组)传递给程序的,但在 Rust 中主函数是个无参函数,环境参数需要开发者通过 std::env 模块取出,过程十分简单:实例fn main() { let args = std::env::args(); println!(“{:?}”, args);} 现在直接运行程序:Args { inner: [“D:\rust\greeting\target\debug\greeting.exe”] }也许你得到的结果比这个要长的多,这很正常,这个结果中 Args 结构体中有一个 inner...