入口函数
声明变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| n main() { let a = 10;
let b: i32 = 20;
let b1 = 30i32;
let mut c = 30i32;
let d = 30_i32;
let e = add(add(a, b), add(c, d)); }
fn add(i: i32, j: i32) -> i32 { i + j }
|
变量可变性
变量默认不可变
可变变量:
1 2 3 4 5 6
| fn main() { let mut x = 5; println!("The value of x is: {}", x); x = 6; println!("The value of x is: {}", x); }
|
print 宏 println!()
Rust 中 print 用宏实现
1 2 3
|
println!("result is {}", a);
|
未使用的变量 警告
变量未使用会有警告,如果要忽略警告,加上 _ 在开头
变量解构
从一个相对复杂的变量中,匹配出该变量的一部分内容:
1 2 3 4
| let (a, mut b): (bool,bool) = (true, false); println!("a = {:?}, b = {:?}", a, b); b = true; assert_eq!(a, b);
|
解构式赋值(Rust 1.59 版本后),可以在赋值语句的左式中使用元组、切片和结构体模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| struct Struct { e: i32 }
fn main() { let (a, b, c, d, e);
(a, b) = (1, 2); [c, .., d, _] = [1, 2, 3, 4, 5]; Struct { e, .. } = Struct { e: 5 };
assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]); }
|
常量
const 定义
1 2
| const MAX_POINTS: u32 = 100_000;
|
常量可以在任意作用域内声明,包括全局作用域
变量遮蔽(shadowing)
后面声明的变量会遮蔽掉前面声明
1 2 3 4
| let spaces = " ";
let spaces = spaces.len();
|
语句和表达式
语句(statement)和表达式(expression)
表达式没有分号结尾,表达式总要返回值
表达式如果不返回任何值,会隐式地返回一个 ()
let 是语句,所以 let b = (let a = 8); 是错的,但是 let 作为表达式已经是试验功能了,在将来或许能够这样使用
序列Range
切片
引用集合中部分连续的元素序列
1 2 3 4 5
| let s = String::from("hello world");
let hello = &s[0..5]; let world = &s[6..11];
|
[开始索引..终止索引] 左闭右开区间
字符串切片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let s = String::from("hello");
let slice = &s[0..2]; let slice = &s[..2];
let len = s.len(); let slice = &s[4..len]; let slice = &s[4..];
let slice = &s[0..len]; let slice = &s[..];
|
数组切片:
1 2 3 4 5
| let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];
assert_eq!(slice, &[2, 3]);
|