为什么方法get
在Option
而非Some
中定义?
可以应用模式匹配或使用foreach
,map
,flatMap
,getOrElse
这是首选,如果None.get
是get
,则不存在运行时异常的危险调用。
是否真的存在get
方法非常有说服力以至于证明这一点的理由?使用NullPointerException
方法提醒我Java,“我不需要检查null,因为我知道var已设置”,然后看到{{1}}。
答案 0 :(得分:6)
当您通过类型系统未捕获的推理知道您拥有的值不是None时,Option.get偶尔会有用。但是,您只有在尝试时才能达到目标:
一次性/交互式代码(REPL,工作表等)也很方便。
答案 1 :(得分:2)
<强>前言强>
创建Scala时兼容JVM作为目标。
因此,Exception
和try/catch
应该被视为语言的一部分,这至少对java互操作性来说非常自然。
考虑到这个前提,现在到了包含可以在代数数据类型(或案例类,如果您愿意)中抛出错误的接口。
致问题
假设我们仅在get
个实例中封装了head
方法(或List
的{{1}})。
这意味着每次我们想要提取值时,我们都被迫在Some
上进行模式匹配。它看起来不太整洁,但仍有可能。
我们可以Option
无处不在,但这意味着如果使用命令式样式(我上次检查时scala中没有禁止),我无法通过错误堆栈发出错误信号。
我的观点是getOrElse
和getOrElse
可用于在需要时强制执行功能样式,但headOption
和get
是必要的选择问题或程序员的偏好。
答案 2 :(得分:0)
没有良好的原因。马丁奥德斯基于2007年在this commit添加了它,所以我想我们需要问他的动机。早期版本具有getOrElse
语义。
答案 3 :(得分:0)
如果您检查提供的commit。这有点明显,为什么和
当它被使用。当您确定有Some
内容时,get用于取消装箱
Option
。它也可以作为一种可继承的方法,其中None.get
引发异常,Some.get
将内容解包。
答案 4 :(得分:0)
在某些情况下,当您的Option
变成None
时,没有追索权,您想要抛出异常。所以,而不是写
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!