【发布时间】:2020-08-18 10:37:00
【问题描述】:
有一门课
class MyType {
def status(): String = "Connected" // demo implementation
}
我有一个val x: Option[Option[MyType]]。我需要像下面这样处理这个值:
x match {
case None => "Error1"
case Some(None) => "Error2"
case Some(Some(t)) => t.status
}
我想用 Tom Morris post 中描述的高阶函数重写相同的代码。正确的编码方式是什么?
有一些关于提出问题的动机的话。官方文档says:
使用
scala.Option实例最惯用的方法是将其视为集合或monad,并使用map、flatMap、filter或foreach<...> 使用scala.Option值的一种不太惯用的方法是通过模式匹配
我不太确定我是否理解 “惯用” 的确切含义,但对我来说听起来像 “好”。
【问题讨论】:
-
注意最后一个
match应该是case Some(Some(t)) => t.status -
只是分享我的两分钱,如果您遵循@Tim 的建议,我会使用模式匹配而不是高阶函数。恕我直言,它更具可读性。
-
@Tim - 谢谢。我会修复
-
@LuisMiguelMejíaSuárez - 谢谢。我用重写 模式匹配 代码的动机扩展了这个问题
-
@Loom 而关于使用
Option作为 Monad 的短语更惯用 (意味着更常见/标准/好)真的。这也取决于上下文。也就是说,当您组合具有多个功能的多个选项时,短语更多地指代。但是,在您的情况下,您只想获得结果,我发现 模式匹配 更容易阅读。 - 但是,我可能会补充说,拥有Option[Option[X]]通常很奇怪,也许它会是一种更惯用的方式来获得相同的最终结果。我在想也许你应该使用Either。
标签: scala higher-order-functions idioms scala-option