跳至主要內容
ColorSky's NoteBook

ColorSky's NoteBook

Math Is Life

Trait

什么是 Trait?

  • Trait 告诉编译器: 某种类型具有那些功能
  • Trait 抽象地定义共享行为
  • Trait bounds(约束): 泛型类型参数指定为实现特定行为的类型
  • like 接口

定义 Trait

  • 把方法签名放在一起,来实现某种目的所必须的一组行为
  • 关键字: trait
  • 只有方法签名,没有具体实现
  • trait 可以有多个方法,以;结尾
  • 实现该 trait 的类型必须提供具体的方法实现

ColorSky大约 2 分钟笔记Rust
测试

测试函数

#[test]
fn tests() {}

ColorSky大约 1 分钟笔记Rust
生命周期

生命周期

  • Rust 的每个引用都有自己的生命周期
  • 生命周期: 引用保持有效的作用域
  • 大多数情况: 生命周期是隐式的,可被推断的
  • 当引用的生命周期可能以不同的方式互相关联时: 手动标注生命周期

生命周期存在的意义:

  • 避免悬垂引用

      let r;
      {
          let x = 1;
          r = &x;
      }
      println!("{}", x)
    

ColorSky小于 1 分钟笔记Rust
第一章 - 集合与常用逻辑用语

题型一:元素与集合的关系

【例 1】已知集合A={12,a2+4a,a2}A = \{12,a^2+4a,a-2\}, 3A-3 \in A,则a=(  )a=(\ \ )


ColorSky大约 13 分钟StudyMath
函数

函数

  • 声明方法

    fn main(){
        print!("hi,rust!");
        function_name();
    }
    
    fn function_name(){
        functiom_body;
    }
    
  • 函数参数:

    1. 形参(parameters)
    2. 实参(arguments)
    3. 在函数签名里,必须声明每个参数的类型,有多个参数时,每个参数的类型必须单独指明
      fn main(){
          function(5, 6);//实参
      }
      fn function(x: i32, y: u32){//形参
          print!("The x is {}, the y is {}", x, y);
      }
      

ColorSky小于 1 分钟笔记Rust
所有权

栈内存(Stack) & 堆内存(Heap)

  • Stack 按值的接受顺序来储存,按相反的顺序将它们移除(后进先出 LIFO,LastIn FirstOut)

    • 添加数据叫做压入栈(压栈)
    • 移除数据叫做弹出栈(出栈)
  • 所有储存在 Stack 上的出局必须拥有固定一致的大小

    • 编译时大小未知的数据或运行时大小可能发生改变的数据必须存放在 Heap 上
  • Heap 内存组织性差一些

    • 当数据放入 Heap 时,程序将请求一定数量的空间
    • 操作系统在 Heap 里找到一块足够大的空间,把它标记为在用,并返回一个指针,也就是这个内存的空间地址
    • 这个过程叫做在 Heap 上进行分配,有时仅仅称之为分配
  • 存储数据

    • 把值压到 Stack 上不叫分配
    • 指针是已知固定大小,可以把指针存放在 Stack 上
      • But,如果想访问实际数据,则必须使用指针进行定位
    • 把数据放到 Stack 上比放在 Heap 上要快得多,因为操作系统不需要寻找用来储存数据的空间,那个位置永远在 Stack 的顶端
  • 访问数据

    • 访问 Heap 中的数据要比访问 Stack 中的数据慢,因为需要用过指针才能找到 heap 中的数据。对于现代的处理器来说,指令在内存跳转的次数越少,,熟读就越快
    • 如果数据放的距离比较近,那么处理速度就会快一些(Stack 上)
    • 如果数据放的距离比较远,那么处理速度就会慢一些(Heap 上)
  • 函数调用: 当你的代码调用函数时,值被传入函数(也包括指向 heap 的指针). 函数本地的变量被压到 Stack 上. 当函数结束后,这些值会从 Stack 上弹出


ColorSky大约 3 分钟笔记Rust
控制流

if 表达式

  • 条件必须为 bool 值
  • 与条件相关联的代码块叫做分支(arm)
  • 可选的,在后边加上一个else表达式
  • 如果使用了多于一个else if,那么最好使用match来重构代码
  • *: if 是表达式,可以用 if 表达式来运算
    let condition = true;
    let number = if condition {5} else {6};//此时number被赋值 5
    //let number = if condition {5} else {"6"};
    //这样是错误的,rust必须知道number的确切类型
    

ColorSky小于 1 分钟笔记Rust
2