整理来自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