Rust基本语法整理(二)

整理来自Rust中文 . 通用集合类型,构建命令行程序.已经看了第二遍,知识点还是容易忘记,整理记录一下,方便查阅.
Rust中文

vector 是用泛型实现的,实例化时必须制定类型,
一个类型注解,如果在编写程序时不能确切无遗地知道运行时会储存进 vector 的所有类型
枚举技术就行不通了。相反,你可以使用 trait 对象

match v.get(2) {
    Some(third) => println!("The third element is {}", third),
    None => println!("There is no third element."),
}
let v = vec![100, 32, 57];
for i in &v {
    println!("{}", i);
}

s.push_str("bar");
"bar"为字符串字面值slice,
push_str获取引用
let s = format!("{}-{}-{}", s1, s2, s3);
String 是一个 Vec 的封装
bytes返回字节 chars返回字符
Value为结构体的HashMap转Vec,结构体需要实现HASH方法
#[derive(Hash)]

        let mut map = HashMap::new();
let scores: HashMap<_, _> = teams.iter().zip(initial_scores.iter()).collect();

对于像 i32 这样的实现了 Copy trait 的类型,其值可以拷贝进哈希 map。对于像 String 这样拥有所有权的值,其值将被移动而哈希 map 会成为这些值的所有者
如果将值的引用插入哈希 map,这些值本身将不会被移动进哈希 map。但是这些引用指向的值必须至少在哈希 map 有效时也是有效的

let mut scores = HashMap::new();

scores.insert(String::from("Yellow"), 50);

for (key, value) in &scores {
    println!("{}: {}", key, value);
}

match分支匹配=>
map_err 和 unwrap_or_else消除match嵌套
unwrap不处理错误 直接panic 不带错误信息
expect带错误信息
? 需要实现From trait来做错误类型转换 ? 只能被用于返回值类型为 Result 的函数

  • 当在函数签名中使用一个类型参数时,必须在使用它之前就声明它
fn largest<T>(list: &[T]) -> T {

标准库中定义的 std::cmp::PartialOrd trait 可以实现类型的比较功能
注意必须在 impl 后面声明 T,这样就可以在 Point<T> 上实现的方法中使用它了。
在 impl 之后声明泛型 T ,这样 Rust 就知道 Point 的尖括号中的类型是泛型而不是具体类型。
单态化编译时泛型类型实例化
以使用 trait bounds 指定泛型
item: impl Summary 方法参数中加impl表示参数为接口
trait bound 泛型接口<T:Summary>(item:T)

item: impl Summary + Display
<T:Summary+Display>(item : T)
<T:Debug+Displaay,U:Dislpay+Clone>(item:T,u:U) 等价于<T,U>(item:T,u:U) where T:Debug+Display,U:Display+Clone

返回值是接口的情况 impl Summary
拷贝” 部分讨论过的,像 i32 和 char 这样的类型是已知大小的并可以储存在栈上,所以他们实现了 Copy trait
fn longest<'a>('a s1:&'a str,s2:&'a str) -> &'a str

  • 第一条规则适用于输入生命周期,后两条规则适用于输出生命周期
    第一条规则是每一个是引用的参数都有它自己的生命周期参数
    fn foo<'a, 'b>(x: &'a i32, y: &'b i32)

  • 第二条规则是如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数:fn foo<'a>(x: &'a i32) -> &'a i32。

*第三条规则是如果方法有多个输入生命周期参数,不过其中之一因为方法的缘故为 &self 或 &mut self
所有的字符串字面值都是 'static 的。

tests 模块中新增加了一行:use super::*;。
tests 是一个普通的模块,它遵循第七章 “私有性规则” 部分介绍的可见性规则。因为这是一个内部模块,要测试外部模块中的代码,需要将其引入到内部模块的作用域中。这里选择使用 glob 全局导入,以便在 tests 模块中使用所有在外部模块定义的内容。

对于自定义的结构体和枚举,需要实现 PartialEq 才能断言他们的值是否相等。需要实现 Debug 才能在断言失败时打印他们的值
可以将一部分命令行参数传递给 cargo test,而将另外一部分传递给生成的测试二进制文件。为了分隔这两种参数,需要先列出传递给 cargo test 的参数,接着是分隔符 --,再之后是传递给测试二进制文件的参数。运行 cargo test --help 会提示 cargo test 的有关参数,而运行 cargo test – --help 可以提示在分隔符 – 之后使用的有关参数。
如果你希望也能看到通过的测试中打印的值,截获输出的行为可以通过 --nocapture

可以在迭代器上调用 collect 方法将其转换为一个集合

unwrap_or_else 可以进行一些自定义的非 panic! 的错误处理。
当 Result 是 Ok 时,这个方法的行为类似于 unwrap:它返回 Ok 内部封装的值。然而,`当其值是 Err 时,该方法会调用一个 闭包(closure)``也就是一个我们定义的作为参数传递给 unwrap_or_else 的匿名函数

Result 的 is_err 方法来检查其是否是一个 error

猜你喜欢

转载自blog.csdn.net/JIYILANZHOU/article/details/105119261