研读Rust圣经解析——Rust learn-11(测试,迭代器,闭包)
测试
测试我不打算很详细的写,大家知道如何使用其实就差不多了
编写测试模块
一般来说我们在lib中编写测试
cargo new test_01 --lib
这样我们构建了一个test的lib
在这个工程里面你看到应该是有个lib.rs没有main.rs的
声明test模块
这里并不是声明一个mod,而是一个测试区域,在区域中可以写很多的测试方法
我们通过#[cfg(test)]
宏来进行标注
#[cfg(test)]
mod tests {
}
编写测试方法
测试方法和普通方法没什么区别,主要在于标注#[test]
#[test]
fn test01() {
assert_eq!(6, 4);
}
执行测试
我们使用cargo test
就可以启动进行测试了,测试会将所有标注#[test]
的方法都测试一遍
测试结果检查
我们通常使用assert检查测试结果
- assert:断言结果为true,否则panic
- assert_eq:断言两边相等,否则panic
- assert_ne:断言两边不等,否则panic
闭包
一个可以储存在变量里的类似函数的结构
Rust 的 闭包(closures)是可以保存在一个变量中或作为参数传递给其他函数的匿名函数。可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获被定义时所在作用域中的值。我们将展示闭包的这些功能如何复用代码和自定义行为。
定义一个闭包
如下,我们使用||{}
定义了一个闭包,很像是函数的写法:
fn main() {
let a = || {
10
};
println!("{}",a());
}
这个闭包会返回10,但是实际a的类型是fn:fn->i32
,对于但语句来说将{}
省略也是OK的
完整写法
|参数|->返回值{
//...
}
闭包可以捕获环境
如下的闭包中使用到了b变量,但是b没有传入闭包,这就和函数有了差别,使得我们在做一些简单的,不用复用的操作的时候可以直接使用闭包而不是定义一个函数
fn main() {
let b = 16;
let a =