Skip to content

基本类型

  • 数值类型: 有符号整数 (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

rust
let x = (-42.0_f32).sqrt();
    if x.is_nan() {
        println!("未定义的数学行为")
    }

数字运算

rust
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 不支持 ++ 和 –-,因为这两个运算符出现在变量的前后会影响代码可读性,减弱了开发者对变量改变的意识能力。

位运算

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);
}

字符、布尔、单元类型

rust
let isTrue:bool=false

字符类型(char)

Rust 的字符只能用 '' 来表示, "" 是留给字符串的。 Rust的 char 类型大小为 4 个字节,代表 Unicode标量值,这意味着它可以支持中文,日文和韩文字符等非英文字符甚至表情符号和零宽度空格在 Rust 中都是有效的 char 值。

注意:由于中文文字编码有两种(GBK 和 UTF-8),所以编程中使用中文字符串有可能导致乱码的出现,这是因为源程序与命令行的文字编码不一致,所以在 Rust 中字符串和字符都必须使用 UTF-8 编码,否则编译器会报错。

布尔(bool)

rust
let isTrue:bool=false

单元类型

()

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

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

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

语句和表达式

表达式后加上分号,它就会变成一条语句,不加会返回一个值

rust

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 中的特殊返回类型

函数没有返回值,那么返回一个 () 通过 ; 结尾的表达式返回一个 ()