Home avatar

搬砖程序员带你飞

砖搬得多了,就能盖楼|

Rust 编程语言 - 智能指针

智能指针起源于C++,并存在于其他语言。Rust 定义了多种不同的智能指针,并提供了多于引用的额外功能。
普通引用和智能指针:引用是一类只借用数据的指针;智能指针拥有他们指向的数据

Rust 编程语言 - 编写自动化测试

如何编写测试

  1. 需要标记注解 #[test]
  2. assert_eq 宏 和 assert_ne 宏 测试相等
  3. assert 宏自定义断言
  4. should_panic 注解预测panic
  5. 还可以通过Result<T, E> 方式测试

控制测试如何运行

  1. 默认并行测试,可以通过 --test-threads=1 指定但县城测试
  2. 显示函数输出 --show-output
  3. 可以指定运行部分测试
  4. [ignore] 注解忽略测试

测试的组织

单元测试

  1. 单元测试,在模块中,指定 [cfg(test)] 注解,可以在编译时忽略test包,加快变异,减少编译结果大小
  2. 通过子模块引用父模块的方法,测试私有函数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
pub fn add_two(a: i32) -> i32 {
    internal_adder(a, 2)
}

fn internal_adder(a: i32, b: i32) -> i32 {
    a + b
}

#[cfg(test)]
mod tests {
    // 引入父模块的私有方法
    use super::*;

    #[test]
    fn internal() {
        assert_eq!(4, internal_adder(2, 2));
    }
}

集成测试

  1. 在src 同级创建 tests 目录,目录结构如下:
1
2
3
4
5
6
7
adder
├── Cargo.lock
├── Cargo.toml
├── src
│   └── lib.rs
└── tests
    └── integration_test.rs
  1. 可以支持多模块

Rust 编程语言 - 范型、Trait和生命周期

范型数据类型

  1. 一般使用T作为类型参数名称
  2. 适用于结构体、枚举、函数等
  3. 支持多个类型
  4. 可以限定方法实现
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
fn largest<T>(list: &[T]) -> &T {
    let mut largest = &list[0];

    for item in list {
        if item > largest {
            largest = item;
        }
    }

    largest
}

struct Point<T,U> {
    x: T,
    y: U,
}

Rust 通过单态化保证运行效率。将通用代码转化为特定代码。

Rust 编程语言 - 错误处理

两种类型的错误,可恢复的和不可恢复的。

可恢复的用Result<T,E>处理,不可恢复的使用panic!宏处理

处理不可恢复的错误

  • panic 时,默认会回溯调用栈,并打印调用展;若为了将bin文件变小,可以在配置中设置panic = 'abort', 直接终止
  • panic 可以手动调用,也可能是异常触发的(例如数组访问超索引)
  • 一般会保留调用栈,方便问题排查
  • 通过 RUST_BACKTRACE 环境变量打印 调用栈(必须是debug 模式)

处理可恢复的错误

Result 处理可恢复的错误, Result 是枚举类型

0%