or() 和 and()
- 用来组合两个表达式
- 类似于其他语言中的
||
和&&
运算符 可以作用于
Option
和Result
类型or()
:有一个值为**Some**
/**Ok**
,就立刻返回这个值and()
:两个值都为**Some**
/**Ok**
时,返回第二个表达式的值,有一个为**None**
/**Err**
时,立刻返回这个值
示例:Some1 or Some2 = Some1
Some or None = Some
None or Some = Some
None1 or None2 = None2
Some1 and Some2 = Some2
Some and None = None
None and Some = None
None1 and None2 = None1
or_else()
类似于or()
,但是指定了闭包(closure
)作为参数,可以作用于Option
和Result
类型
示例:
fn main() {
// or_else with Option
let 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 = Some1
assert_eq!(s1.or_else(fn_none), s1); // Some or_else None = Some
assert_eq!(n.or_else(fn_some), s2); // None or_else Some = Some
assert_eq!(n.or_else(fn_none), None); // None1 or_else None2 = None2
// or_else with Result
let 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 = Ok1
assert_eq!(o1.or_else(fn_err), o1); // Ok or_else Err = Ok
assert_eq!(e1.or_else(fn_ok), o2); // Err or_else Ok = Ok
assert_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,结果为None
assert_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类型,则应用closure
assert_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 nightly
fn 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类型,应用closure
assert_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类型,应用closure
assert_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)
}