基本类型
- 数值类型: 有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 、浮点数 (f32, f64)、以及有理数、复数
- 字符串:字符串字面量和字符串切片 &str
- 布尔类型: true 和 false
- 字符类型: 表示单个 Unicode 字符,存储为 4 个字节
- 单元类型: 即 () ,其唯一的值也是 ()
rust 会自动推断类型; let guess = "42".parse().expect("Not a number!");
如果自动推断类型失败,用let guess: i32 = ...
或者 "42".parse::<i32>()
整数类型
Rust 整型默认使用 i32
;
显式处理溢出
- 使用
wrapping\_\*
方法在所有模式下都按照补码循环溢出规则处理,例如 wrapping_add - 如果使用
checked\_\*
方法时发生溢出,则返回 None 值 - 使用
overflowing\_\*
方法返回该值和一个指示是否存在溢出的布尔值 - 使用
saturating\_\*
方法使值达到最小值或最大值
浮点类型
默认浮点类型是 f64;
f32 0.1 + 0.2==0.3 f64 不等, 精度问题;
NaN
判断是否是 nan
let x = (-42.0_f32).sqrt();
if x.is_nan() {
println!("未定义的数学行为")
}
数字运算
fn main() {
let sum = 5 + 10; // 加
let difference = 95.5 - 4.3; // 减
let product = 4 * 30; // 乘
let quotient = 56.7 / 32.2; // 除
let remainder = 43 % 5; // 求余
sum += 1 等同于 sum = sum + 1
}
注意:Rust 不支持 ++ 和 –-,因为这两个运算符出现在变量的前后会影响代码可读性,减弱了开发者对变量改变的意识能力。
位运算
fn main() {
// 二进制为00000010
let a:i32 = 2;
// 二进制为00000011
let b:i32 = 3;
println!("(a & b) value is {}", a & b);
println!("(a | b) value is {}", a | b);
println!("(a ^ b) value is {}", a ^ b);
println!("(!b) value is {} ", !b);
println!("(a << b) value is {}", a << b);
println!("(a >> b) value is {}", a >> b);
let mut a = a;
// 注意这些计算符除了!之外都可以加上=进行赋值 (因为!=要用来判断不等于)
a <<= b;
println!("(a << b) value is {}", a);
}
字符、布尔、单元类型
let isTrue:bool=false
字符类型(char)
Rust 的字符只能用 '' 来表示, "" 是留给字符串的。 Rust的 char 类型大小为 4 个字节,代表 Unicode标量值,这意味着它可以支持中文,日文和韩文字符等非英文字符甚至表情符号和零宽度空格在 Rust 中都是有效的 char 值。
注意:由于中文文字编码有两种(GBK 和 UTF-8),所以编程中使用中文字符串有可能导致乱码的出现,这是因为源程序与命令行的文字编码不一致,所以在 Rust 中字符串和字符都必须使用 UTF-8 编码,否则编译器会报错。
布尔(bool)
let isTrue:bool=false
单元类型
()
没错, main 函数就返回这个单元类型()
,你不能说 main 函数无返回值,因为没有返回值的函数在 Rust 中是有单独的定义的:发散函数( diverge function ),顾名思义,无法收敛的函数。
例如常见的 println!()
的返回值也是单元类型 ()
。
再比如,你可以用 ()
作为 map 的值,表示我们不关注具体的值,只关注 key。 这种用法和 Go 语言的 struct{}
类似,可以作为一个值用来占位,但是完全不占用任何内存。
语句和表达式
表达式后加上分号,它就会变成一条语句,不加会返回一个值
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
// 类似三元运算符,在Rust里我们可以这样写
let y = if x % 2 == 1 {
"odd"
} else {
"even"
};
// 或者写成一行
let z = if x % 2 == 1 { "odd" } else { "even" };
}
函数
- 函数名和变量名使用蛇形命名法(snake case),例如 fn add_two() -> {}
- 函数的位置可以随便放,Rust 不关心我们在哪里定义了函数,只要有定义即可
- 每个函数参数都需要标注类型
Rust 是强类型语言,因此需要你为每一个函数参数都标识出它的具体类型,例如:
Rust 中的特殊返回类型
函数没有返回值,那么返回一个 () 通过 ; 结尾的表达式返回一个 ()