scala - Scala Option.fold 在函数内外表现不同
问题描述
采取简单的功能:
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
定义为:
case object None extends Option[Nothing]
因此,当您在“内容”上调用方法时,None
您正在调用 type 值的方法Nothing
。此类型没有方法toUpperCase
,因此您会收到错误消息。
然而Nothing
,它与每种类型兼容,并且Option
与其类型参数协变,因此Option[Nothing]
与Option[String]
. 这就是为什么None
可以传递给你的makeUpper
方法。一旦知道内容的类型,就可以String
在toUpperCase
其上调用方法。
推荐阅读
- python - InvalidArgumentError:无法挤压昏暗 [2],预期维度为 1,得到 10
- sql - 创建一个数据集,该数据集在任何记录存在时都生成 0/1 标志
- vb.net - Web Server Controls Code Behind 看不到我的数据集配置
- html - 当“恢复窗口”到原始大小时跳转到 html 锚点,没有 JS?
- sql - 在sql查询中排除日期范围
- jhipster - jHipster mongock 迁移
- javascript - 数组的复杂问题
- ios - NWPathMonitor 的 pathUpdateHandler 块在应用程序后台到前台转换时被调用
- three.js - Three.js 中着色器中的多个缓冲区。使用 setRenderTarget 而不是 renderTarget 的 WebGL
- javascript - SlickJS 在加载时垂直对齐幻灯片,但在与箭头交互时修复布局