Rust基础语法

定义变量

main.rs
fn main() { let x = 5; println!("The value of x is: {}", x); }

let关键字定义变量,变量名后面跟一个等号,然后跟变量的值。变量名是x,变量的值是5println!宏用于打印输出。{}是占位符,x的值将被替换。 在Rust中,变量是 immutable(不可变的)的,除非你使用mut关键字来声明一个可变的变量。

main.rs
fn main() { let mut x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); }

数据类型

  • 数值类型:有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
  • 字符串:字符串字面量和字符串切片 &str
  • 布尔类型:true 和 false
  • 字符类型:表示单个 Unicode 字符,存储为 4 个字节
  • 单元类型:即 () ,其唯一的值也是 ()

整数类型

长度有符号类型无符号类型
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128
视架构而定isizeusize

字符类型

main.rs
fn main() { let x: char = '杨'; println!("{}", size_of_val(&x)); }

布尔(bool)

main.rs
use rand; fn main() { let mut count = 0; // 统计随机数小于0.5的个数 for _ in 1..=100 { // 循环100次 count += if rand::random_bool(0.5) { 1 } else { 0 }; // 判断随机数是否小于0.5,如果是则加1,否则不加 } println!("{}", count); }

单元类型

单元类型就是 (), 唯一的值也是 ()

fn main() 函数就返回这个单元类型 (),你不能说 main 函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:发散函数( diverge function ),顾名思义,无法收敛的函数。

例如常见的 println!() 的返回值也是单元类型 ()。

再比如,你可以用 () 作为 map 的值,表示我们不关注具体的值,只关注 key。 这种用法和 Go 语言的 struct 类似,可以作为一个值用来占位,但是完全不占用任何内存。

位运算

运算符说明
& 位与相同位置均为1时则为1,否则为0
| 位或相同位置只要有1时则为1,否则为0
^ 异或相同位置不相同则为1,相同则为0
! 位非把位中的0和1相互取反,即0置为1,1置为0
<< 左移所有位向左移动指定位数,右位补0
>> 右移所有位向右移动指定位数,带符号移动(正数补0,负数补1)

序列(Range)

Rust 提供了一个非常简洁的方式,用来生成连续的数值,例如 1..5,生成从 1 到 4 的连续数字,不包含 5 ;1..=5,生成从 1 到 5 的连续数字,包含 5,它的用途很简单,常常用于循环中:

main.rs
for i in 1..=5 { println!("{}", i); } for i in 'a'..='z' { println!("{}",i); }

函数

main.rs
fn main() { println!("Hello, world!"); }

fn关键字定义一个函数,函数名是main,函数体是println!宏。println!宏用于打印输出。

fn
main.rs
fn add(i: i32, j: i32) -> i32 { i + j }

声明函数的关键字 fn,函数名 add(),参数 ij,参数类型和返回值类型都是 i32

函数要点

  • 函数名和变量名使用蛇形命名法(snake case),例如 fn add_two() -> { }
  • 函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可
  • 每个函数参数都需要标注类型

函数参数

Rust 是静态类型语言,因此需要你为每一个函数参数都标识出它的具体类型

main.rs
fn add(i: i32, j: i32) -> i32 { println!("The value of i is: {}", i); println!("The value of j is: {}", j); i + j }

函数返回

函数的返回值就是函数体最后一条表达式的返回值,当然我们也可以使用 return 提前返回

main.rs
// 函数体最后一条表达式的返回值 fn add(i: i32, j: i32) -> i32 { i + j } // 使用`return`提前返回 fn add(i: i32, j: i32) -> i32 { if i == 0 { return j; } if j == 0 { return i; } i + j } fn main() { let result = add(5, 6); println!("The result is: {}", result); }

永不返回的发散函数 !

当用 ! 作函数返回类型的时候,表示该函数永不返回( diverge function ),特别的,这种语法往往用做会导致程序崩溃的函数:

main.rs
fn dead_end() -> ! { panic!("This function never returns!"); }
main.rs
fn forever() -> ! { loop { //... }; }

数据类型

在Rust中,数据类型是静态的,这意味着在编译时,编译器会检查变量的类型,并确保它们在使用之前已经声明。 在Rust中,数据类型分为两种:

  1. 静态类型:编译器在编译时检查变量的类型,并确保它们在使用之前已经声明。
  2. 动态类型:编译器在运行时检查变量的类型,并确保它们在使用之前已经声明。
fn main() { let x = 5; println!("The value of x is: {}", x); }