【发布时间】:2021-07-20 14:09:18
【问题描述】:
取简单函数:
def makeUpper(input: Option[String]): String =
input.fold("b"){ _.toUpperCase }
makeUpper(Some("a")) // A
makeUpper(None) // b
这符合预期。
现在,相同的代码,但在函数之外:
Some("a").fold("b"){ _.toUpperCase } // A
None.fold("b"){ _.toUpperCase } // error: value toUpperCase is not a member of Nothing
注意:
Option.empty[String].fold("b"){ _.toUpperCase } // b
问题:
- 为什么会有不同的行为?为什么会出现函数外的错误?
函数是否将输入 None 转换为“确定的” Option.empty[String]?
- 处理返回 Option(Some 或 None)的函数返回的正确方法是什么...我们是否总是必须在另一个函数中处理返回值以避免上述问题?
我错过了什么?
【问题讨论】:
-
问题是你永远不应该有一个类型为
None.type或Some的值总是Option[X]- 如果你知道你有一个None,为什么还要打电话给fold如果你知道它总是会调用isEmpty参数。