Rust特有的Option和Result,给开发者增加了一些工作量,标准库为了减少这部分工作,提供了不少实用的方法,这其中以map,ok和and尤为常见。
下面以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(),
}
}