.unwrap_or(0)
1
2
3
4
5
|
let opt: Option<i32> = Some(3);
let value = opt.unwrap_or(0); // 0 being the default
let opt: Option<String> = Some("some value".to_owned());
let value = opt.as_deref().unwrap_or("default string");
|
https://stackoverflow.com/questions/31233938/converting-from-optionstring-to-optionstr
两者都在程序执行期间求值,并且可以是任意值。区别在于:
使用unwrap_or时,将在调用unwrap_or之前评估后备值,因此将评估是否需要该值(因为Rust是一种急切的语言)。
使用unwrap_or_else时,仅当unwrap_or_else触发后备值时(通过调用传递的函数)才评估后备值,因此仅在需要时才评估后备值。
Option & unwrap
https://doc.rust-lang.org/stable/rust-by-example/error/option_unwrap.html
如果可能缺少标准枚举,则在标准库中使用一个名为Option 的枚举。它表现为两个“选项”之一:
Some(T):找到类型T的元素
无:未找到任何元素
这些情况可以通过match显式处理,也可以通过unwrap隐式处理。隐式处理将返回内部元素或发生恐慌。
unwrap
returns a panic
when it receives a None
.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
let floders: Vec<Floder> = serde_json::from_slice(&body[..]).unwrap();
let mut j: Vec<Floder> = Vec::new();
// println!("Response: {:?} {:?}", floders[0].title, floders);
let mut i = floders.iter();
while let Some(floder) = i.next() {
// println!("First before inner loop: {:?}", floder);
if floder.title == "learn" {
println!("{:?}", floder.children);
if floder.children != None {
j.extend(floder.children.as_ref().unwrap().iter().cloned());
}
}
}
println!("{:?}", j);
|