.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);