当前位置:嗨网首页>书籍在线阅读

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中的第4个元素,如果没有找到相应的元素则返回None。现在我们有一个应用场景——计算数值的平方。我们可以在get_nth方法的返回值上使用map方法,并传入之前定义的double函数;或者我们可以提供一个内联形式的闭包,如下所示:

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类型的独特之处远不止于此。