or() 和 and()
- 用来组合两个表达式
- 类似于其他语言中的
||和&&运算符 可以作用于
Option和Result类型or():有一个值为**Some**/**Ok**,就立刻返回这个值and():两个值都为**Some**/**Ok**时,返回第二个表达式的值,有一个为**None**/**Err**时,立刻返回这个值
示例:Some1 or Some2 = Some1Some or None = SomeNone or Some = SomeNone1 or None2 = None2
Some1 and Some2 = Some2Some and None = NoneNone and Some = NoneNone1 and None2 = None1
or_else()
类似于or(),但是指定了闭包(closure)作为参数,可以作用于Option和Result类型
示例:
fn main() {// or_else with Optionlet s1 = Some("some1");let s2 = Some("some2");let fn_some = || Some("some2"); // 定义闭包let n: Option<&str> = None;let fn_none = || None;assert_eq!(s1.or_else(fn_some), s1); // Some1 or_else Some2 = Some1assert_eq!(s1.or_else(fn_none), s1); // Some or_else None = Someassert_eq!(n.or_else(fn_some), s2); // None or_else Some = Someassert_eq!(n.or_else(fn_none), None); // None1 or_else None2 = None2// or_else with Resultlet o1: Result<&str, &str> = Ok("ok1");let o2: Result<&str, &str> = Ok("ok2");let fn_ok = |_| Ok("ok2"); // 定义闭包let e1: Result<&str, &str> = Err("error1");let e2: Result<&str, &str> = Err("error2");let fn_err = |_| Err("error2");assert_eq!(o1.or_else(fn_ok), o1); // Ok1 or_else Ok2 = Ok1assert_eq!(o1.or_else(fn_err), o1); // Ok or_else Err = Okassert_eq!(e1.or_else(fn_ok), o2); // Err or_else Ok = Okassert_eq!(e1.or_else(fn_err), e2); // Err1 or_else Err2 = Err2}
and_then()
类似于add(),但是指定了闭包(closure)作为参数,可以作用于Option和Result类型
filter()
filter()用来对数组中元素做过滤操作,只作用于Option类型:
- 元素是
**Some()**类型closure返回了**true**,则返回原内容(Some()类型)closure返回了**false**,则返回**None**类型
- 元素是
**None**类型,则返回**None**类型
示例:
fn main() {let s1 = Some(3);let s2 = Some(6);let n = None;let fn_is_even = |x: &i8| x % 2 == 0;assert_eq!(s2.filter(fn_is_even), s2); // Some类型且closure返回true,结果为原内容assert_eq!(s1.filter(fn_is_even), n); // Some类型但closure返回false,结果为Noneassert_eq!(n.filter(fn_is_even), n); // None类型,返回None}
map() and map_err()
- 用来对每个元素应用
closure - 参数都指定为
closure - 可以将内部数据的类型转换为其他类型
map()
- 对
Option和Result类型都有效 closure只会作用于Some()和Ok(),改变其值和类型- 不会影响
**Err()**的值 - 对于
None和Err(),并没有直接返回,closure同样起了类型转换的作用:Option<T> to Option<U>Result<T, E> to Result<U, E>
示例:
fn main() {let s1 = Some("abcde");let s2 = Some(5);let n1: Option<&str> = None;let n2: Option<usize> = None;let o1: Result<&str, &str> = Ok("abcde");let o2: Result<usize, &str> = Ok(5);let e1: Result<&str, &str> = Err("abcde");let e2: Result<usize, &str> = Err("abcde");let fn_character_count = |s: &str| s.chars().count();assert_eq!(s1.map(fn_character_count), s2); // 改变Some的值和类型assert_eq!(n1.map(fn_character_count), n2); // None没有值assert_eq!(o1.map(fn_character_count), o2); // 改变Ok的值和类型assert_eq!(e1.map(fn_character_count), e2); // 未改变e1的值}
map_err()
- 只对
Result类型有效 - 只会作用于
Err(),改变其值和类型 - 不会影响
**Ok()**的值 - 对于
**Ok**(),并没有直接返回,closure同样起了类型转换的作用:Result<T, E> to Result<T, F>
map_or() and map_or_else()
- 用来为遇到
None/Err()类型的情况指定默认值 - 两者的第一个参数不同
map_or()指定一个默认值map_or_else()指定一个closure
- 返回的是数值而不是
**Option**/**Result**
map_or()
- 只支持
Option类型 - 需要在第一个参数中提供默认值
- 当前值是
**Some()**类型,则将其应用到closure - 当前值是
**None**类型,则返回默认值
示例:
fn main() {// 指代默认值const V_DEFAULT: i8 = 1;let s = Some(10);let n: Option<i8> = None;let fn_closure = |v: i8| v + 2;assert_eq!(s.map_or(V_DEFAULT, fn_closure), 12); // Some类型,则应用closureassert_eq!(n.map_or(V_DEFAULT, fn_closure), V_DEFAULT); // None类型,则返回默认值}
map_or_else()
- 对
Option和Result类型都有效 - 第一个参数中提供
**closure** - 当前值是
**Some()**类型,则将其应用到closure - 当前值是
**None**类型,则应用第一个**closure**
示例:
#![feature(result_map_or_else)] // enable unstable library feature 'result_map_or_else' on nightlyfn main() {let s = Some(10);let n: Option<i8> = None;let fn_closure = |v: i8| v + 2;let fn_default = || 1; // 为None类型准备的闭包assert_eq!(s.map_or_else(fn_default, fn_closure), 12); // Some类型,应用closureassert_eq!(n.map_or_else(fn_default, fn_closure), 1); // None类型,应用第一个闭包let o = Ok(10);let e = Err(5);let fn_default_for_result = |v: i8| v + 1; // 为Err类型准备的闭包assert_eq!(o.map_or_else(fn_default_for_result, fn_closure), 12); // Ok类型,应用closureassert_eq!(e.map_or_else(fn_default_for_result, fn_closure), 6); // Err类型,应用第一个闭包}
ok_or() and ok_or_else()
- 用来将
Option类型转换为Result类型Some()->Ok()None->Err()
- 需要指定遇到
**None**类型时,对应的**Err()**的值ok_or()参数是一个默认值ok_or_else()参数是一个**closure**
ok_or()
- 需要指定遇到
None类型时,对应的Err()的值
示例:
fn main() {// 指定Err类型的值const ERR_DEFAULT: &str = "error message";let s = Some("abcde");let n: Option<&str> = None;let o: Result<&str, &str> = Ok("abcde");let e: Result<&str, &str> = Err(ERR_DEFAULT);assert_eq!(s.ok_or(ERR_DEFAULT), o); // Some(T) -> Ok(T)assert_eq!(n.ok_or(ERR_DEFAULT), e); // None -> Err(default)}
ok_or_else()
- 需要指定一个
closure来返回Err的值
fn main() {let s = Some("abcde");let n: Option<&str> = None;// 指定closure返回Err的值let fn_err_message = || "error message";let o: Result<&str, &str> = Ok("abcde");let e: Result<&str, &str> = Err("error message");assert_eq!(s.ok_or_else(fn_err_message), o); // Some(T) -> Ok(T)assert_eq!(n.ok_or_else(fn_err_message), e); // None -> Err(default)}
