result的使用
let x: Result<u32, &str> = Ok(1);
let y: Result<u32, &str> = Err("asdf");
map
示例
let y: Result<u32, &str> = Err("asdf");
let is_right = y.map(|_| true)
.map_err(|_|false);
细节
pub fn map<U, F: FnOnce(T) -> U>(self, op: F) -> Result<U, E> {
match self {
Ok(t) => Ok(op(t)),
Err(e) => Err(e),
}
}
pub fn map_err<F, O: FnOnce(E) -> F>(self, op: O) -> Result<T, F> {
match self {
Ok(t) => Ok(t),
Err(e) => Err(op(e)),
}
}
可以看出如果调用map的result如果
值是Ok则返回Ok(传入的函数(OK中存的值))
值如果是Err则原封不动的返回
map_err基本意思一样,就是反过来
最后map的返回还是一个result,所以可以像a.map().map_err()这样的链式调用下去
另外如果不想返回的还是一个else的话,就使用map_or或者map_or_else
pub fn map_or<U, F: FnOnce(T) -> U>(self, default: U, f: F) -> U {
match self {
Ok(t) => f(t),
Err(_) => default,
}
}
pub fn map_or_else<U, D: FnOnce(E) -> U, F: FnOnce(T) -> U>(self, default: D, f: F) -> U {
match self {
Ok(t) => f(t),
Err(e) => default(e),
}
}
map_or是处理Ok的值,然后Err的任何值都返回一个默认的
mapr_or是Ok和Err的值都进行处理