在 Scala 中返回 None 而不是 Option 会出现编译错误

问题描述 投票:0回答:2

这是一个简单的问题,我无法弄清楚:

以下代码给出以下编译错误:

def parseJson(q: String) = Option[JsValue]{
    try{
            Json.parse(q)
    }catch{
        case e: com.codahale.jerkson.ParsingException => None
    }
}

错误

[error]  found   : None.type (with underlying type object None)
[error]  required: play.api.libs.json.JsValue
[error]             case e: com.codahale.jerkson.ParsingException => None

考虑到我的响应类型是 Option[JsValue],为什么我不能返回 None?

scala playframework-2.0
2个回答
10
投票

您实际上想将

Json.parse(q)
放入
Some()
中,而不是将整个代码包装在
Option[JsValue]
中,而是将其用作签名:

def parseJson(q: String): Option[JsValue] = {
    try{
       Some(Json.parse(q))
    }catch{
       case e: com.codahale.jerkson.ParsingException => None
    }
}

但无论如何,你应该更喜欢使用 scala.util.control.Exception:

 import scala.util.control.Exception._
 catching(classOf[com.codahale.jerkson.ParsingException]).opt(Json.parse(q))

2
投票

我认为您只是错误定义了方法定义的语法。按照您编写的方式,您将在 try/catch 块的结果上调用

Option.apply
。我想你是想写这个:

def parseJson(q: String): Option[JsValue] = {
  try {
    Some(Json.parse(q))
  } catch {
    case e: com.codahale.jerkson.ParsingException => None
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.