Rust Option/Result 实用方法

Rust特有的Option和Result,给开发者增加了一些工作量,标准库为了减少这部分工作,提供了不少实用的方法,这其中以map,ok和and尤为常见。 下面以Option为例讲解:

Option

map函数只是帮助开发者少写一些match,常用于从Option取出值,传到闭包里面执行,map的返回值是也是一个Option,包的是闭包的返回值。

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

map_or和map_or_else的返回值类型就是闭包F的返回值类型。 两者的区别是:default是直接传入,还是由传入的闭包产生的。

pub fn map_or<U, F: FnOnce(T) -> U>(self, default: U, f: F) -> U {
          
   
    match self {
          
   
        Some(t) => f(t),
        None => default,
    }
}

pub fn map_or_else<U, D: FnOnce() -> U, F: FnOnce(T) -> U>(self, default: D, f: F) -> U {
          
   
    match self {
          
   
        Some(t) => f(t),
        None => default(),
    }
}

ok_or和ok_or_else的作用是将Option转化为Result。 两者的区别是err是直接传入的,还是由传入的闭包产生的。

pub fn ok_or<E>(self, err: E) -> Result<T, E> {
          
   
    match self {
          
   
        Some(v) => Ok(v),
        None => Err(err),
    }
}

pub fn ok_or_else<E, F: FnOnce() -> E>(self, err: F) -> Result<T, E> {
          
   
    match self {
          
   
        Some(v) => Ok(v),
        None => Err(err()),
    }
}

and和and_then的作用是将一个Option转换为另外一个Option。 两者的区别是新的Option是直接传入的,还是由传入的闭包产生的。

pub fn and<U>(self, optb: Option<U>) -> Option<U> {
          
   
    match self {
          
   
        Some(_) => optb,
        None => None,
    }
}

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

or和and是相反的,or是self为None时返回新的Option。

pub fn or(self, optb: Option<T>) -> Option<T> {
          
   
    match self {
          
   
        Some(_) => self,
        None => optb,
    }
}

pub fn or_else<F: FnOnce() -> Option<T>>(self, f: F) -> Option<T> {
          
   
    match self {
          
   
        Some(_) => self,
        None => f(),
    }
}
经验分享 程序员 微信小程序 职场和发展