10

为什么方法get定义在Option而不是在Some

可以应用模式匹配或使用foreach, map, flatMapgetOrElse无论如何都是首选的,如果None.get被调用,则不会出现运行时异常的危险。

是否真的存在这种get方法非常容易证明这一点的情况?使用该get方法让我想起 Java,其中“我不必检查 null,因为我知道 var 已设置”,然后看到NullPointerException.

4

5 回答 5

6

当您通过类型系统未捕获的推理知道您拥有的值不是 None 时,Option.get 有时会很有用。但是,只有在您尝试过时才应该使用它:

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

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

于 2013-05-21T09:03:38.147 回答
2

前言

Scala 的创建以兼容 JVM 作为目标。

因此,Exceptions 和try/catch应该被视为语言的一部分是很自然的,至少对于 java 互操作性而言。

考虑到这个前提,现在要包括可能在代数数据类型(或案例类,如果您愿意)中引发错误的接口。


到问题

假设我们仅在实例中封装get方法(或headfor )。 这意味着我们每次想要提取值时都被迫进行模式匹配。它看起来不太整洁,但仍然有可能。ListSome
Option

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

我的观点是,getOrElseandheadOption可以在需要时强制执行函数式样式,但是如果命令式是适合问题或程序员偏好的选择,则getand是很好的选择。head

于 2013-05-21T10:42:17.830 回答
0

没有充分的理由。Martin Odersky 在 2007 年的这次提交中添加了它,所以我想我们需要问问他的动机。早期版本具有getOrElse语义。

于 2013-05-21T08:23:48.603 回答
0

在某些情况下,当你的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!
于 2013-05-22T04:26:43.700 回答
0

如果您检查提供的提交。为什么以及何时使用它很明显。当您Some确定 Option. 它也可以作为一种可继承的方法,在该方法中None.get引发异常并Some.get拆箱内容。

于 2013-05-21T09:16:46.110 回答