返回Option时不需要一些吗?

病毒的

我正在做“ Rust by Example”更多组合器部分,并决定自己动手,看看用map代替多少努力and_then

在尝试过程中,我遇到了一些非常奇怪的事情(对我来说,它甚至看起来像是编译器错误)。看起来像我只需要返回一个Food类型时,返回类型应该是Option(Food)

我认为,cookable下面功能应该可以简化为一行:

have_ingredients(food).map(|f| can_cook(f))

显然也可以是:

have_ingredients(food).and_then(can_cook)

尽管我看不到这两个函数之间的根本区别,但它们都返回Option<U>

这样做时,我遇到一个奇怪的编译器错误,因此我按如下所示明确地破坏了匹配-看起来Food即使返回类型为,编译器也想返回Some(Food)到底是怎么回事???

//! stack.rs
#[derive(Debug)]
enum Food {
    CordonBleu,
    Steak,
    Sushi,
}

#[derive(Debug)]
enum Day {
    Monday,
    Tuesday,
    Wednesday,
}

/// we don't have the ingredients for sushi
fn have_ingredients(food: Food) -> Option<Food> {
    match food {
        Food::Sushi => None,
        _ => Some(food),
    }
}

/// can cook anything but cordon blue
fn can_cook(food: Food) -> Option<Food> {
    match food {
        Food::CordonBlue => None,
        _ => Some(food),
    }
}

/// can be done using map
fn cookable(food: Food) -> Option<Food> {
    match have_ingredients(food).map(|f| can_cook(f)) {
        // Some(food) => food,  // Why is this correct???
        Some(food) => Some(food), // **error: mismatched types:
        None => None,
    }
}

fn eat(food: Food, day: Day) {
    match cookable(food) {
        Some(food) => println!("Yay! On {:?} we eat {:?}", day, food),
        None => println!("Oh no we didn't get to eat on {:?}!", day),
    };
}

fn main() {
    let (cordon_bleu, steak, sushi) = (Food::CordonBleu, Food::Steak, Food::Sushi);
    eat(cordon_bleu, Day::Monday);
    eat(steak, Day::Tuesday);
    eat(sushi, Day::Wednesday);
}

这是上述程序的完整编译器错误:

 ch16_errors git:(master) ✗ rustc stack.rs
stack.rs:38:28: 38:32 error: mismatched types:
 expected `Food`,
    found `core::option::Option<Food>`
(expected enum `Food`,
    found enum `core::option::Option`) [E0308]
stack.rs:38         Some(food) => Some(food),
                                       ^~~~
stack.rs:38:28: 38:32 help: run `rustc --explain E0308` to see a detailed explanation
error: aborting due to previous error
维德拉克
have_ingredients(food).map(|f| can_cook(f))

给出Option<Option<Food>>,而不是Option<Food>,因为map它不会展平值。

考虑

Option<T>::map(Fn(T) -> U)

这将转换Option<T>Option<U>从而让T = FoodU = Option<Food>can_cook给出了实例

Option<Food>::map(Fn(Food) -> Option<Food>)

给出一个Option<Option<Food>>

因此Some(food),比赛中food的类型为Option<Food>

and_then 展平结果类型,这就是为什么这种情况不会发生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试将它们设置为UITableView的边框时,一些不需要的UIImageViews消失了

来自分类Dev

从 SQL 结果中不需要一些凭证

来自分类Dev

windeployqt错过了一些库,但得到了一些不需要的库

来自分类Dev

为什么有些程序需要-h而另一些则不需要

来自分类Dev

我创建的这个 HTML/CSS 页面上出现了一些不需要的边框

来自分类Dev

使用 xpath 提取值会产生一些不需要的字符串

来自分类Dev

为什么有些类需要main方法,而另一些则不需要呢?

来自分类Dev

为什么有些类需要main方法,而另一些则不需要呢?

来自分类Dev

为什么有些程序需要Path值,而另一些程序在Windows中却不需要?

来自分类Dev

为什么有些角度指令需要双重卷曲,而另一些则不需要?

来自分类Dev

为什么当我用Rcpp编写时,不需要包括一些我应该用普通C ++编写的库?

来自分类Dev

为什么某些Ruby方法需要爆炸,而另一些则不需要成为破坏性方法?

来自分类Dev

如何使用汇总从mysql查询中删除新行上不需要的一些数据

来自分类Dev

在R中,如何从CSV文件名中删除一些不需要的字符并提取日期?

来自分类Dev

如何从存储在内存中的一些我不需要的 I/O 变量中排除?

来自分类Dev

正则表达式多个带有可选参数的URL,一些URL需要反向引用,有些则不需要

来自分类Dev

有人告诉我,有时不需要“()”就可以调用不需要返回的函数,对吗?

来自分类Dev

返回不需要的行

来自分类Dev

在haskell中使用foldl时不需要参数吗?

来自分类Dev

Bitlocker在启动时不需要PIN吗?

来自分类Dev

当不需要返回时如何执行 observable

来自分类Dev

不需要标签的一键编码吗?

来自分类Dev

如何在C#中保留一些交错阵列的列和行并删除不需要的列和行

来自分类Dev

为什么在返回一个简单数组时switchMap不需要可观察的对象

来自分类Dev

为什么在返回一个简单数组时switchMap不需要可观察的对象

来自分类Dev

使用flux:grid 和v:content.render 时需要添加一些Typoscript 吗?

来自分类Dev

事件中不需要EventHandler吗?

来自分类Dev

方法参数不需要__bridge吗?

来自分类Dev

FSI缓存不需要的东西吗?

Related 相关文章

  1. 1

    尝试将它们设置为UITableView的边框时,一些不需要的UIImageViews消失了

  2. 2

    从 SQL 结果中不需要一些凭证

  3. 3

    windeployqt错过了一些库,但得到了一些不需要的库

  4. 4

    为什么有些程序需要-h而另一些则不需要

  5. 5

    我创建的这个 HTML/CSS 页面上出现了一些不需要的边框

  6. 6

    使用 xpath 提取值会产生一些不需要的字符串

  7. 7

    为什么有些类需要main方法,而另一些则不需要呢?

  8. 8

    为什么有些类需要main方法,而另一些则不需要呢?

  9. 9

    为什么有些程序需要Path值,而另一些程序在Windows中却不需要?

  10. 10

    为什么有些角度指令需要双重卷曲,而另一些则不需要?

  11. 11

    为什么当我用Rcpp编写时,不需要包括一些我应该用普通C ++编写的库?

  12. 12

    为什么某些Ruby方法需要爆炸,而另一些则不需要成为破坏性方法?

  13. 13

    如何使用汇总从mysql查询中删除新行上不需要的一些数据

  14. 14

    在R中,如何从CSV文件名中删除一些不需要的字符并提取日期?

  15. 15

    如何从存储在内存中的一些我不需要的 I/O 变量中排除?

  16. 16

    正则表达式多个带有可选参数的URL,一些URL需要反向引用,有些则不需要

  17. 17

    有人告诉我,有时不需要“()”就可以调用不需要返回的函数,对吗?

  18. 18

    返回不需要的行

  19. 19

    在haskell中使用foldl时不需要参数吗?

  20. 20

    Bitlocker在启动时不需要PIN吗?

  21. 21

    当不需要返回时如何执行 observable

  22. 22

    不需要标签的一键编码吗?

  23. 23

    如何在C#中保留一些交错阵列的列和行并删除不需要的列和行

  24. 24

    为什么在返回一个简单数组时switchMap不需要可观察的对象

  25. 25

    为什么在返回一个简单数组时switchMap不需要可观察的对象

  26. 26

    使用flux:grid 和v:content.render 时需要添加一些Typoscript 吗?

  27. 27

    事件中不需要EventHandler吗?

  28. 28

    方法参数不需要__bridge吗?

  29. 29

    FSI缓存不需要的东西吗?

热门标签

归档