学习资料: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 |
isize
与usize
类型依赖与运行程序的计算机架构:64位架构上它们是64位的,32位架构上它们是32位的。
在debug模式下,出现整型溢出的问题时,rust使程序panic
,而在release构建中,rust不检查溢出,进行二进制补码包装的操作。
浮点型分为f32
和f64
。布尔型分为true
和false
。字符类型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 | } |
复合类型
元组类型
元组是一个将多个其它类型的值组合进一个复合类型的主要方式。元组长度固定,一旦声明,其长度不会增大或缩小。