Option
unwrap_or_else 接收一个FnOnce。
FnOnce 特性代表可以被调用一次并且消耗捕获变量的闭包或函数。所有的闭包至少实现了 FnOnce,因为所有闭包都可以被调用一次。
FnMut: 可修改捕获环境且多次调用闭包。
Fn: 仅对捕获环境不可变访问且多次调用。

 pub fn unwrap_or_else<F>(self, f: F) -> T
    where
        F: FnOnce() -> T,
    {
        match self {
            Some(x) => x,
            None => f(),
        }
    }

测试:
let y4 = None;
print!("{}", y4.unwrap_or_else(|| "xxx"));

unwrap_unchecked 是 Rust 中一个特性,用于在运行时禁用安全检查来解包 Option 或 Result 类型。它类似于常用的 unwrap 方法,但不同之处在于,unwrap_unchecked 是一个不安全的操作,如果在 None 或 Err 的情况下使用会导致未定义的行为和严重的内存崩溃。

let y = Some("hello world");
unsafe { println!("{}", y.unwrap_unchecked()); }

//map 返回也是option,可以解决null的问题吧
println!("{}", y.map(|x| {
    let x = String::from(x);
    x.len()
}).unwrap());

let result = xx.and(Some(9));
let r: Option<i32> = result.and_then(|x| Some(x + 1)).and_then(|_| None).and_then(|x| Some(x));

这些方法都会消耗所有权的, as_ref可以解决消耗所有权

let xx = Some(String::from("xxx"));
// println!("{}", xx.clone().filter(|x| x.len() > 0).unwrap_or_default());
print!("{}", xx.unwrap());
match xx {
    Some(x) => println!("{}", x),
    None => println!("none")
}
println!("{}", xx.as_ref().unwrap());

具体来说,Vec<T> 类型提供了 as_slice 方法,而 Option 类型提供了 as_deref 方法

let opt_vec: Option<Vec<i32>> = Some(vec![1, 2, 3, 4, 5]);
let opt_slice: Option<&[i32]> = opt_vec.as_deref();

putao
8 声望3 粉丝

推动世界向前发展,改善民生。


« 上一篇
rust--trait