学习资料:Rust程序设计语言 简体中文在线版。

入门指南

安装

1
curl https://sh.rustup.rs -sSf | sh
2
3
source $HOME/.cargo/env
4
5
vim ~/.bash_profile
6
export PATH="$HOME/.cargo/bin:$PATH"
7
8
	mkdir ~/rust_projects
1
/* main.rs */
2
fn main(){
3
    println!("Hello, world!"); /* println!是宏 */
4
}
1
rustfmt main.rs /* 格式化 */
2
rustc main.rs

Hello,Cargo!

Cargo是Rust的构建系统和包管理器。大多数Rustacean们使用Cargo来管理他们的Rust项目,因为它可以为你处理很多任务,比如构建代码,下载依赖并编译这些库。

1
cargo --version
2
3
cargo new hello_cargo
4
cd hello_cargo

Cargo生成两个文件和一个目录:一个Cargo.toml文件,一个src目录,以及位于src目录中的main.rs文件。同时也生成了git仓库,以及一个.gitignore文件。

1
[package]
2
name = "hello_cargo"
3
version = "0.1.0"
4
authors = ["your name"]
5
edition = "2018"
6
7
[dependencies]

hello_cargo目录下,输入cargo build命令来构建项目,该命令生成可执行文件target/debug/hell_cargo。也可以使用cargo run在一个命令中同时编译并运行生成可执行文件。

Cargo还提供了一个叫cargo check的命令。该命令快速检查代码确保其可以编译,但并不产生可执行文件。

当项目最终准备好发布时,可以使用cargo build --release来优化编译项目。该命令会在target/release而不是target/debug下生成可执行文件。

基本编程概念

变量与可变性

rust变量默认是不可改变的(immutable)。

变量和常量的区别

常量(constants),不允许对常量使用mut。常量不止默认不可变,它总是不能变的。声明常量使用const关键字而不是let,并且必须注明值的类型。常量可以在任何作用域中声明,包括全局作用域。

1
const MAX_POINTS: u32 = 100_000;

隐藏(Shadowing)

定义一个与之前变量同名的新变量,新变量会隐藏之前的变量。可以用同名变量来隐藏一个变量,以及重复使用let关键字来多次隐藏。

隐藏与将变量标记为mut不同,当尝试对变量重新赋值时,如果没有使用let关键字,就会导致编译时错误。通过使用let,可以用这个值进行一些计算,但是计算完后变量仍然是不变的。

1
fn main() {
2
	let x = 5;
3
4
	let x = x + 1;
5
6
	let x = x * 2;
7
	println!("The value of x is: {}", x);
8
}

mut隐藏的另一个区别:当再次使用let时,实际上创建了一个新变量,可以改变值的类型,同时复用这个名字。

1
let spaces = " ";  //字符串
2
let spaces = spaces.len();  //整型

数据类型

标量类型

整型是没有小数部分的数字。Rust的默认类型数字类型是i32

长度 有符号 无符号
8-bit i8 u8
16-bit i16 u16
32-bit i32 u32
64-bit i64 u64
128-bit i128 u128
arch isize usize

isizeusize类型依赖与运行程序的计算机架构:64位架构上它们是64位的,32位架构上它们是32位的。

在debug模式下,出现整型溢出的问题时,rust使程序panic,而在release构建中,rust不检查溢出,进行二进制补码包装的操作。

浮点型分为f32f64布尔型分为truefalse字符类型char的大小为四个字节。

1
fn main(){
2
	let x = 2.0;
3
	let y: f32 = 3.0;
4
	let t = true;
5
	let f: bool = false; //显示指定类型注解
6
	let c = 'z';
7
}

复合类型

元组类型

元组是一个将多个其它类型的值组合进一个复合类型的主要方式。元组长度固定,一旦声明,其长度不会增大或缩小。

数组类型