08-组合器应用
6.3.2 组合器应用
使用map方法非常简单:
// using_map.rs
fn get_nth(items: &Vec<usize>, nth: usize) -> Option<usize> {
if nth < items.len() {
Some(items[nth])
} else {
None
}
}
fn double(val: usize) -> usize {
val * val
}
fn main() {
let items = vec![7, 6, 4, 3, 5, 3, 10, 3, 2, 4];
println!("{}", items.len());
let doubled = get_nth(&items, 4).map(double);
println!("{:?}", doubled);
}
在上述代码中,我们有一个名为get_nth的方法,它为我们获取Vec
let doubled = get_nth(&items, 10).map(|v| v * v);
这是链式调用的简易形式。并且比之前使用的match表达式和if let语句更简洁。
前面对map方法的解释也适用于接下来将要介绍的一组方法,我们将跳过对它们类型签名的解释,因为逐个对它们进行解释会比较烦琐。相反,我们将简要解释这些方法提供的功能。建议你参考它们的说明文档,并熟悉其类型签名。
- map_err:此方法仅作用于Result类型,并允许将失败的值从E转换为其他类型的H,但仅当值为Err值时才有效。map_err不兼容于Option类型,因为使用None执行任何操作都是无意义的。
- and_then:此方法如果执行失败,则将返回表示失败的某个值;如果执行成功,则会将闭包作为第2个参数,该参数作用于包装值,并返回该包装类型。当你需要逐一对内部值进行转换时,这将非常有用。
- unwrap_or:此方法提取内部表示成功执行的值,如果执行失败,则返回默认值。用户可以将默认值作为第2个参数传递给它。
- unwrap_or_else:此方法与前面的方法作用相同,但是当函数执行失败时,会通过将闭包作为第2个参数来计算不同的值。
- as_ref:此方法将内部值转换为引用,并返回包装值,即Option<&T>或Result<&T, &E>。
- or/ or_else:这些方法返回某个表示成功执行的值,或者返回替代Ok/Some的值,它会作为第 2 个参数被提供。or_else接收一个闭包,你需要在该闭包中返回某个表示成功执行的值。
- as_mut:此方法将内部值转换为可变引用,并返回包装值,即Option<&mut T>或者Result<&mut T, &mut E>。
Option和Result类型的独特之处远不止于此。