Rust编程(一)基础语法
变量
变量绑定
let a = 10;
let b = "hello";
let c = false;
可变变量
let mut a = 10;
a = 20;
忽略未使用变量
let _a = 10;
let b = 20;
println!("{}", b);
变量解构
let (a, mut b): (bool, i64) = (true, 1234);
解构式赋值
struct Person{
age: i32
}
fn main() {
let (a, b, c, d, e);
(a, b) = (1, 2);
[c, .., d, _] = [1, 2, 3, 4, 5];
Person { e, .. } = Struct { e: 5 };
assert_eq!([1, 2, 1, 4, 5], [a, b, c, d, e]);
}
常量
常量不允许使用 mut。常量自始至终不可变,在编译完成后,已经确定它的值。常量使用 const 关键字并且值的类型必须标注。
const MAX_POINTS: u32 = 100_000;
变量遮蔽(shadowing)
fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("The value of x in the inner scope is: {}", x);
}
println!("The value of x is: {}", x);
}
如果你在某个作用域内无需再使用之前的变量,就可以重复的使用变量名字。
let spaces = " ";
let spaces = spaces.len();
修改类型也没有问题。
类型
- 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
- 字符串:字符串字面量和字符串切片 &str
- 布尔类型: true和false
- 字符类型: 表示单个 Unicode 字符,存储为 4 个字节
- 单元类型: 即 () ,其唯一的值也是 ()
类型推导
let guess = "42".parse().expect("Not a number!"); // ❎
let guess : i32 = "42".parse().expect("Not a number!"); // ✅
整数
| 长度 | 有符号类型 | 无符号类型 |
|---|---|---|
| 8 位 | i8 |
u8 |
| 16 位 | i16 |
u16 |
| 32 位 | i32 |
u32 |
| 64 位 | i64 |
u64 |
| 128-位 | i128 |
u128 |
| 视架构而定 | isize |
usize |
每个有符号类型规定的数字范围是 \(-\left(2^{n-1}\right) \sim 2^{n-1}-1\), 其中 \(n\) 是该定义形式的位长度。因此 \(i 8\) 可存储数 字范围是 \(-(2^{7}) \sim 2^{7}-1\), 即 \(-128 \sim 127\) 。无符号类型可以存储的数字范围是 \(0 \sim 2^{n}-1\), 所以 u8 能够存储 的数字为 \(0 \sim 2^{8}-1\), 即 \(0 \sim 255\) 。
| 数字字面量 | 示例 |
|---|---|
| 十进制 | 98_222 |
| 十六进制 | 0xff |
| 八进制 | 0o77 |
| 二进制 | 0b1111_0000 |
字节 (仅限于 u8) |
b'A' |
关于溢出:debug模式下panic,release模式下按照补码循环溢出。
浮点类型
let x = 2.0; // f64
let y: f32 = 3.0; // f32
NaN
let x = (-100.0_f32).sqrt();
if x.is_nan() {
println!("未定义的数学行为")
}
判断是否发生了数学上未定义的结果。
数字运算
fn main() {
// 加法
let sum = 15 + 210;
// 减法
let difference = 945.5 - 54.3;
// 乘法
let product = 46 * 340;
// 除法
let quotient = 562.7 / 132.2;
// 求余
let remainder = 843 % 45;
}
位运算
| 运算符 | 说明 |
|---|---|
| & 位与 | 相同位置均为1时则为1,否则为0 |
| | 位或 | 相同位置只要有1时则为1,否则为0 |
| ^ 异或 | 相同位置不相同则为1,相同则为0 |
| ! 位非 | 把位中的0和1相互取反,即0置为1,1置为0 |
| << 左移 | 所有位向左移动指定位数,右位补零 |
| >> 右移 | 所有位向右移动指定位数,左位补零 |
序列(Range)
for i in 1..=5 {
println!("{}",i);
}
for i in 'a'..='z' {
println!("{}",i);
}
类型小结
- Rust拥有相当多的数值类型。
- 类型转换必须是显式的。
- Rust 的数值上可以使用方法,如:
13.14_f32.round()。