如果有选择,那么获取它的值或抛出异常尝试的惯用方法是什么?
def foo() : String = {
val x : Option[String] = ...
x.getOrException()
}
发布于 2013-04-29 09:18:53
(编辑:这不是最好或最惯用的方式。我是在不熟悉Scala的时候写的。我把它留在这里作为一个如何不这样做的例子。现在我会这样做:@TravisBrown)
我认为这可以归结为两件事:
如果在代码中,您希望值出现故障,而在远程情况下,您希望程序快速失败失败( get
),那么我只会执行一个普通get
,如果没有值,就让Scala抛出一个NoSuchElementException
:
def foo() : String = {
val x : Option[String] = ...
x.get
}
如果你想以不同的方式处理这种情况(抛出你自己的异常),我认为一种更优雅的方式将如下所示:
def foo(): String = {
val x: Option[String] = None
x match {
case Some(value) => value
case None => throw new MyRuntimeException("blah")
}
}
当然,如果您希望为Option
为None
的情况提供您自己的替代值,则只需使用getOrElse
def foo(): String = {
val x: Option[String] = None
x.getOrElse("my alternative value")
}
发布于 2013-04-28 14:03:20
throw
“语句”实际上是Scala中的一个表达式,它的类型是Nothing
,这是所有其他类型的子类型。这意味着您可以只使用普通的老式getOrElse
def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))
你真的真的不应该这么做。
发布于 2013-04-28 14:05:33
只需使用.get方法。
def get[T](o:Option[T]) = o.get
如果o是None的实例,它将抛出NoSuchElementException。
基本上,我会使用这样的选项:
def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println)
addPrint(Some(41))
addPrint(Some(1336))
addPrint(None)
以避免你的特定问题。
https://stackoverflow.com/questions/16263560
复制相似问题