or() 和 and()

  • 用来组合两个表达式
  • 类似于其他语言中的||&&运算符
  • 可以作用于OptionResult类型

  • 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)作为参数,可以作用于OptionResult类型

示例:

  1. fn main() {
  2. // or_else with Option
  3. let s1 = Some("some1");
  4. let s2 = Some("some2");
  5. let fn_some = || Some("some2"); // 定义闭包
  6. let n: Option<&str> = None;
  7. let fn_none = || None;
  8. assert_eq!(s1.or_else(fn_some), s1); // Some1 or_else Some2 = Some1
  9. assert_eq!(s1.or_else(fn_none), s1); // Some or_else None = Some
  10. assert_eq!(n.or_else(fn_some), s2); // None or_else Some = Some
  11. assert_eq!(n.or_else(fn_none), None); // None1 or_else None2 = None2
  12. // or_else with Result
  13. let o1: Result<&str, &str> = Ok("ok1");
  14. let o2: Result<&str, &str> = Ok("ok2");
  15. let fn_ok = |_| Ok("ok2"); // 定义闭包
  16. let e1: Result<&str, &str> = Err("error1");
  17. let e2: Result<&str, &str> = Err("error2");
  18. let fn_err = |_| Err("error2");
  19. assert_eq!(o1.or_else(fn_ok), o1); // Ok1 or_else Ok2 = Ok1
  20. assert_eq!(o1.or_else(fn_err), o1); // Ok or_else Err = Ok
  21. assert_eq!(e1.or_else(fn_ok), o2); // Err or_else Ok = Ok
  22. assert_eq!(e1.or_else(fn_err), e2); // Err1 or_else Err2 = Err2
  23. }

and_then()

类似于add(),但是指定了闭包(closure)作为参数,可以作用于OptionResult类型

filter()

filter()用来对数组中元素做过滤操作,只作用于Option类型:

  • 元素是**Some()**类型
    • closure返回了**true**,则返回原内容Some()类型
    • closure返回了**false**则返回**None**类型
  • 元素是**None**类型,则返回**None**类型

示例:

  1. fn main() {
  2. let s1 = Some(3);
  3. let s2 = Some(6);
  4. let n = None;
  5. let fn_is_even = |x: &i8| x % 2 == 0;
  6. assert_eq!(s2.filter(fn_is_even), s2); // Some类型且closure返回true,结果为原内容
  7. assert_eq!(s1.filter(fn_is_even), n); // Some类型但closure返回false,结果为None
  8. assert_eq!(n.filter(fn_is_even), n); // None类型,返回None
  9. }

map() and map_err()

  • 用来对每个元素应用closure
  • 参数都指定为closure
  • 可以将内部数据的类型转换为其他类型

map()

  • OptionResult类型都有效
  • closure只会作用于Some()Ok(),改变其值和类型
  • 不会影响**Err()**的值
  • 对于NoneErr(),并没有直接返回closure同样起了类型转换的作用:
    • Option<T> to Option<U>
    • Result<T, E> to Result<U, E>

示例:

  1. fn main() {
  2. let s1 = Some("abcde");
  3. let s2 = Some(5);
  4. let n1: Option<&str> = None;
  5. let n2: Option<usize> = None;
  6. let o1: Result<&str, &str> = Ok("abcde");
  7. let o2: Result<usize, &str> = Ok(5);
  8. let e1: Result<&str, &str> = Err("abcde");
  9. let e2: Result<usize, &str> = Err("abcde");
  10. let fn_character_count = |s: &str| s.chars().count();
  11. assert_eq!(s1.map(fn_character_count), s2); // 改变Some的值和类型
  12. assert_eq!(n1.map(fn_character_count), n2); // None没有值
  13. assert_eq!(o1.map(fn_character_count), o2); // 改变Ok的值和类型
  14. assert_eq!(e1.map(fn_character_count), e2); // 未改变e1的值
  15. }

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**类型,则返回默认值

示例:

  1. fn main() {
  2. // 指代默认值
  3. const V_DEFAULT: i8 = 1;
  4. let s = Some(10);
  5. let n: Option<i8> = None;
  6. let fn_closure = |v: i8| v + 2;
  7. assert_eq!(s.map_or(V_DEFAULT, fn_closure), 12); // Some类型,则应用closure
  8. assert_eq!(n.map_or(V_DEFAULT, fn_closure), V_DEFAULT); // None类型,则返回默认值
  9. }

map_or_else()

  • OptionResult类型都有效
  • 第一个参数中提供**closure**
  • 当前值是**Some()**类型,则将其应用到closure
  • 当前值是**None**类型,则应用第一个**closure**

示例:

  1. #![feature(result_map_or_else)] // enable unstable library feature 'result_map_or_else' on nightly
  2. fn main() {
  3. let s = Some(10);
  4. let n: Option<i8> = None;
  5. let fn_closure = |v: i8| v + 2;
  6. let fn_default = || 1; // 为None类型准备的闭包
  7. assert_eq!(s.map_or_else(fn_default, fn_closure), 12); // Some类型,应用closure
  8. assert_eq!(n.map_or_else(fn_default, fn_closure), 1); // None类型,应用第一个闭包
  9. let o = Ok(10);
  10. let e = Err(5);
  11. let fn_default_for_result = |v: i8| v + 1; // 为Err类型准备的闭包
  12. assert_eq!(o.map_or_else(fn_default_for_result, fn_closure), 12); // Ok类型,应用closure
  13. assert_eq!(e.map_or_else(fn_default_for_result, fn_closure), 6); // Err类型,应用第一个闭包
  14. }

ok_or() and ok_or_else()

  • 用来将Option类型转换为Result类型
    • Some()->Ok()
    • None->Err()
  • 需要指定遇到**None**类型时,对应的**Err()**的值
    • ok_or()参数是一个默认值
    • ok_or_else()参数是一个**closure**

ok_or()

  • 需要指定遇到None类型时,对应的Err()的值

示例:

  1. fn main() {
  2. // 指定Err类型的值
  3. const ERR_DEFAULT: &str = "error message";
  4. let s = Some("abcde");
  5. let n: Option<&str> = None;
  6. let o: Result<&str, &str> = Ok("abcde");
  7. let e: Result<&str, &str> = Err(ERR_DEFAULT);
  8. assert_eq!(s.ok_or(ERR_DEFAULT), o); // Some(T) -> Ok(T)
  9. assert_eq!(n.ok_or(ERR_DEFAULT), e); // None -> Err(default)
  10. }

ok_or_else()

  • 需要指定一个closure来返回Err的值
  1. fn main() {
  2. let s = Some("abcde");
  3. let n: Option<&str> = None;
  4. // 指定closure返回Err的值
  5. let fn_err_message = || "error message";
  6. let o: Result<&str, &str> = Ok("abcde");
  7. let e: Result<&str, &str> = Err("error message");
  8. assert_eq!(s.ok_or_else(fn_err_message), o); // Some(T) -> Ok(T)
  9. assert_eq!(n.ok_or_else(fn_err_message), e); // None -> Err(default)
  10. }

as_ref() and as_mut()

  • 用来获取类型的引用(&)和可变引用(&mut)

    as_ref()

  • Option<T> -> Option<&T>

  • Result<T, E> -> Result<&T, &E>

    as_mut()

  • Option<T> -> Option<&mut T>

  • Result<T, E> -> Result<&mut T, &mut E>