快速入门 Rust - 精简篇01

57 阅读4分钟

变量

关键字作用修改重新定义指定类型
let变量不能被修改可以重新定义可以不指定类型
const常量不能被修改不可以重新定义必须指定类型
mut关键字*需要在 let 后添加*
    let // 变量 不能被修改 可以重新定义 可以不指定类型  例:
    let x = 1;
    x = 2; // ×
    let x = "1"; //  √
    const // 常量 不能被修改 不可以重新定义 必须指定类型 例:
    const THREE:u8 = 3;
    THREE = 5; // ×
    const THREE = 3; // ×
    const mut THREE:u8 = 3; // ×
    mut // 如果要修改 let 变量的值 需要在定义前 添加关键字 例:
    let mut x = 1;
    x = 2; // √
    x = "2" // × 注: 可以修改值但是不可以修改数据类型

数据类型

整型

长度有符号类型无符号类型
8 位i8u8
16 位i16u16
32 位i32u32
64 位i64u64
128 位i128u128
archisizeusize

注:isize 和 usize 类型,若使用 64 位架构系统则为 64 位,若使用 32 位架构系统则为 32 位

整型溢出:假设 u8 可以存 0-255 如果存入的是 256 那么就会变成 0,257-->1,Rust 会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作

整型字面量

数字字面量示例
十进制98_222
十六进制0xff
八进制0o77
二进制0b1111_0000
字节 (仅限于 u8)b'A'

Rust 的整型默认是 i32,isizeusize 的主要应用场景是用作某些集合的索引

浮点数

Rust 的浮点型是 f32f64,它们的大小分别为 32 位和 64

    let x = 2.0; // f64
    let y:f32 = 3.0; // f32

布尔类型

    let t = true;
    let f:bool = false;

字符类型

    let x = ' ';
    let c = 'z';
    let cat = '🐱';

Rust 的字符类型大小为 4 个字节,表示的是一个 Unicode 标量值,这意味着它可以表示的远远不止是 ASCII标音字母中文/日文/韩文的文字emoji,还有零宽空格(zero width space)Rust 中都是合法的字符类型。Unicode 值的范围为 U+0000 ~ U+D7FFU+E000~U+10FFFF

复合类型

复合类型均无法放大缩小 类似于push等操作 如需增加删除可以使用 vector (动态数组)

    let v: Vec<i32> = Vec::new();
    v.push(1)
    v.push(-1)
  1. 元组(tuple)
    let tup:(u32,f32,u8) = (10,20.1,399)
    // 可以结构
    let (x, y, z) = tup;
    // 取值用索引
    let one = tup.0;

注:() 为特殊的单元值,如果表达式不返回任何东西,则默认返回单元值

  1. 数组(Array)
    let a = [1, 2, 3, 4, 5]; //每个元素类型必须相同
    let b = [3; 5] // 等同于 let b = [3, 3, 3, 3, 3]
    let c: [i32; 5] = [1, 2, 3, 4, 5]; // 写在前面就是定义类型
    let one = a[0]; // 取值 1
    // 索引越界会报错

函数

    fn main(){
        // body
        funcOne(5, 244)
    }
    fn funcOne(x:i32, y:u8){ // 参数必须定义类型
        println!("{}-{}", x, y);
    }
    // 带有返回值 必须定义返回类型
    fn live() -> u32 { // 函数内未被 ; 结尾的会被返回
        10
    }
    let x = live(); // x = 10

赋值

    let x = (let y = 6); // × let y = 6 不返回任何值
    let x = let y = 6; // ×

块级作用域

    let y = {
        let x = 3;
        x + 1
    };
    // 其中 x + 1 没有用 ; 结尾
    // 相当于将 x + 1 的结果 return出去 赋给了 y

注:此处没有修改 x 的值 只是临时计算了 x + 1 的结果 并赋值给了 y 此时 x 在作用域内 还是 3

流程判断

if

    let x = 1;

    if x < 2 {
        println!("true");
    }

    if x == 2 {
        println!("true");
    }else if x == 4 {
        println!("4");
    }else {
        println!("false");
    }

    let is_number = true;
    let y = if is_number { 5 } else { 6 }; // 类似于 三目运算符
    let z = if is_number { "number" } else { 6 }; // × 类型必须一致

循环

    loop {
        println!("123");
    }
    loop {
        println!("123");
        break; // 跳出
    }

    loop {
        'loopOne:loop{
            println!("123");
            break 'loopOne; // 跳出指定循环 注意这里一定是要单引号!
        }
        break;
    }
    let mut number = 1;
    while number > 0 {
        println!("{}",number);
        number -= 1;
    }
    println!("while end");
    let a = [1, 2, 3, 4, 5];
    for el in a {
        println!("{}",el);
    }

    for i in (1..10) { // 1-10
        println!("{}",i)
    }

注释

// 为普通类型注释 /// 为文档类型注释 支持 Markdown 语法 , 用来生成 html