首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >获取选项值或抛出异常

获取选项值或抛出异常
EN

Stack Overflow用户
提问于 2013-04-28 21:53:49
回答 5查看 78.4K关注 0票数 77

如果有选择,那么获取它的值或抛出异常尝试的惯用方法是什么?

代码语言:javascript
代码运行次数:0
运行
复制
def foo() : String = {
  val x : Option[String] = ...
  x.getOrException()
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-29 17:18:53

(编辑:这不是最好或最惯用的方式。我是在不熟悉Scala的时候写的。我把它留在这里作为一个如何不这样做的例子。现在我会这样做:@TravisBrown)

我认为这可以归结为两件事:

  • 如何确定值在那里?
  • 如果值不在,您想如何react

如果在代码中,您希望值出现故障,而在远程情况下,您希望程序快速失败失败( get ),那么我只会执行一个普通get,如果没有值,就让Scala抛出一个NoSuchElementException

代码语言:javascript
代码运行次数:0
运行
复制
def foo() : String = {
  val x : Option[String] = ...
  x.get
}

如果你想以不同的方式处理这种情况(抛出你自己的异常),我认为一种更优雅的方式将如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
def foo(): String = {
  val x: Option[String] = None
  x match {
    case Some(value) => value
    case None => throw new MyRuntimeException("blah")
  }
} 

当然,如果您希望为OptionNone的情况提供您自己的替代值,则只需使用getOrElse

代码语言:javascript
代码运行次数:0
运行
复制
def foo(): String = {
  val x: Option[String] = None
  x.getOrElse("my alternative value")
} 
票数 50
EN

Stack Overflow用户

发布于 2013-04-28 22:03:20

throw“语句”实际上是Scala中的一个表达式,它的类型是Nothing,这是所有其他类型的子类型。这意味着您可以只使用普通的老式getOrElse

代码语言:javascript
代码运行次数:0
运行
复制
def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))

你真的真的不应该这么做。

票数 135
EN

Stack Overflow用户

发布于 2013-04-28 22:05:33

只需使用.get方法。

代码语言:javascript
代码运行次数:0
运行
复制
def get[T](o:Option[T]) = o.get

如果o是None的实例,它将抛出NoSuchElementException。

基本上,我会使用这样的选项:

代码语言:javascript
代码运行次数:0
运行
复制
def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println)
addPrint(Some(41))
addPrint(Some(1336))
addPrint(None)

以避免你的特定问题。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16263560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档