为什么方法get
定义在Option
而不是在Some
?
可以应用模式匹配或使用foreach
, map
, flatMap
,getOrElse
无论如何都是首选的,如果None.get
被调用,则不会出现运行时异常的危险。
是否真的存在这种get
方法非常容易证明这一点的情况?使用该get
方法让我想起 Java,其中“我不必检查 null,因为我知道 var 已设置”,然后看到NullPointerException
.
为什么方法get
定义在Option
而不是在Some
?
可以应用模式匹配或使用foreach
, map
, flatMap
,getOrElse
无论如何都是首选的,如果None.get
被调用,则不会出现运行时异常的危险。
是否真的存在这种get
方法非常容易证明这一点的情况?使用该get
方法让我想起 Java,其中“我不必检查 null,因为我知道 var 已设置”,然后看到NullPointerException
.
当您通过类型系统未捕获的推理知道您拥有的值不是 None 时,Option.get 有时会很有用。但是,只有在您尝试过时才应该使用它:
对于一次性/交互式代码(REPL、工作表等)也很方便。
前言
Scala 的创建以兼容 JVM 作为目标。
因此,Exception
s 和try/catch
应该被视为语言的一部分是很自然的,至少对于 java 互操作性而言。
考虑到这个前提,现在要包括可能在代数数据类型(或案例类,如果您愿意)中引发错误的接口。
到问题
假设我们仅在实例中封装get
方法(或head
for )。
这意味着我们每次想要提取值时都被迫进行模式匹配。它看起来不太整洁,但仍然有可能。List
Some
Option
我们可以getOrElse
无处不在,但这意味着如果使用命令式样式(我上次检查时在 scala 中不禁止),我无法通过错误堆栈发出失败信号。
我的观点是,getOrElse
andheadOption
可以在需要时强制执行函数式样式,但是如果命令式是适合问题或程序员偏好的选择,则get
and是很好的选择。head
没有充分的理由。Martin Odersky 在 2007 年的这次提交中添加了它,所以我想我们需要问问他的动机。早期版本具有getOrElse
语义。
在某些情况下,当你的Option
结果是 aNone
时,没有追索权,你想抛出异常。所以,而不是写
myOption match {
case Some(value) => // use value
case None => throw new RuntimeException("I really needed that value")
}
你可以简单地写
myOption.get // might throw an exception
它还可以Option
更好地从 Java 中使用,并结合isDefined
:
if (myOption.isDefined()) process(myOption.get());
else // it's a None!
如果您检查提供的提交。为什么以及何时使用它很明显。当您Some
确定
Option
. 它也可以作为一种可继承的方法,在该方法中None.get
引发异常并Some.get
拆箱内容。