rust 程序设计笔记(1)

发布时间 2023-11-11 11:50:39作者: azoux

简介 - Rust 程序设计语言 简体中文版

hello world & rust相关工具使用

  • hello world
    • rustc
      • rustc --version
      • complie .rs program
    • main()
      • entry point
      • all blocks wrapped by { }
    • cargo
      • cargo is a package manager for rust
      • cmd
        • cargo --version
        • cargo new proj-name
          • create a new rust project
          • cargo.toml
            • name version edition
            • dependencies
          • cargo build
            • -release
            • 模式是调试构建,会将可执行文件放在 debug 目录下
          • cargo run
            • compile & run
          • cargo check
            • 在不生成二进制文件的情况下构建项目来检查错误
  • guessing game
    • 关联函数 === 类的静态方法
    • crate
      • rust lib
      • 包含.rs文件,但不能执行

common concepts

  • match 表达式

    • 是js中switch的健身版,提供更加强健的安全,并且不用break
    • match里的case支持接受condtion
    let guess: i32 = match guess.trim().parse() {
                Ok(num) => num,
                Err(_) => continue
            };
    
  • shadowing

    • rust允许重复创建同名变量
    • 重复使用let
  • 变量

    • let 生命默认是不可变
    • let mut 声明变量
    • const 声明全局作用域有效的常量
  • expression-based

    fn main() {
        let y = {
            let x = 3;
            x + 1
        };
    
        println!("The value of y is: {y}");
    }
    
    • 表达式会返回值,语句不会,即使没有显示的return语句
      • 上面match的 Ok(num) ⇒ num 也是这个道理
      • 最后一个表达式默认就是这个block的返回值,如果加上来分号,那就是语句了
      • 这一块反而有点像js的arrow function: const a = () ⇒ 1
      • 如果加上分号的话,也可以用 return 来显示的返回
  • 注释

    • 简单注释
    • 文档注释
  • 使用if来赋值

    • let x = if condition { 1 } else
  • 循环

    • keyword: loop
    • 循环标签,多重嵌套循环可以给break 加上标签来表明需要跳出哪一个循环
  • while 循环

    • 可以用loop+if+break实现相同功能
  • for循环

    • 用于遍历数组、map等
  • small task:打印fibonacci数列

fn main() {
    let num_n = get_n_fibonacci(13);
    println!("fibonacci num n = {num_n}")
}

fn get_n_fibonacci(n: u32) -> u32 {
    let mut index = n - 1;
    let mut num1 = 0;
    let mut num2 = 1;

    while index > 0 {
        index -= 1;
        let new_num = num1 + num2;
        num1 = num2;
        num2 = new_num;
    }

    return num1;
}