为什么有Option.get方法

时间:2013-05-21 04:59:41

标签: scala scala-collections api-design

为什么方法getOption而非Some中定义?

可以应用模式匹配或使用foreachmapflatMapgetOrElse这是首选,如果None.getget,则不存在运行时异常的危险调用。

是否真的存在get方法非常有说服力以至于证明这一点的理由?使用NullPointerException方法提醒我Java,“我不需要检查null,因为我知道var已设置”,然后看到{{1}}。

5 个答案:

答案 0 :(得分:6)

当您通过类型系统未捕获的推理知道您拥有的值不是None时,Option.get偶尔会有用。但是,您只有在尝试时才能达到目标:

  • 安排您的类型表达这些知识。
  • 使用提到的Option处理方法(flatMap,getOrElse等),但它们都不合适。

一次性/交互式代码(REPL,工作表等)也很方便。

答案 1 :(得分:2)

<强>前言

创建Scala时兼容JVM作为目标。

因此,Exceptiontry/catch应该被视为语言的一部分,这至少对java互操作性来说非常自然。

考虑到这个前提,现在到了包含可以在代数数据类型(或案例类,如果您愿意)中抛出错误的接口。


致问题

假设我们仅在get个实例中封装了head方法(或List的{​​{1}})。 这意味着每次我们想要提取值时,我们都被迫在Some上进行模式匹配。它看起来不太整洁,但仍有可能。

我们可以Option无处不在,但这意味着如果使用命令式样式(我上次检查时scala中没有禁止),我无法通过错误堆栈发出错误信号。

我的观点是getOrElsegetOrElse可用于在需要时强制执行功能样式,但headOptionget是必要的选择问题或程序员的偏好。

答案 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!