2013-01-17 60 views
1

這是一個簡單的問題,我不能只是弄清楚:返回無不是在斯卡拉選項讓編譯錯誤

下面的代碼提供了以下編譯錯誤:

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]?

+2

你可能要考慮考慮看看'scala.util {嘗試,成功,失敗}'斯卡拉2.10.0。 – adelbertc

回答

10

你真的想要把Json.parse(Q)進入一些(),而不是包裝整個代碼中的選項[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)) 
+0

Im標記爲正確,因爲Some( )也不見了,但是要感謝你倆 – dgrandes

+0

好奇他爲什麼應該用scala.util.control.Exception這個類是什麼?從未聽說過 –

+1

因爲它可以在一行而不是四行中實現相同的行爲!和更好的風格檢查scaladoc,有一個關於如何使用它的好介紹:)(鏈接在響應中) –

1

我認爲你剛纔得到的方法定義的語法錯誤。你寫這個的方式你調用了try/catch塊的結果Option.apply。我想你的意思是這樣寫:

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

他沒有這樣的事情。請仔細閱讀。原始方法定義沒有定義返回類型,而是嘗試調用Option伴侶對象的apply方法。 Kim發佈的代碼正確定義了該方法的返回類型。 –

+1

事實上,我的壞,所以習慣閱讀':Option .. =「!我檢查五次,試圖發現差異沒有成功:-( –

+2

@BenKyrlach OP的事實寫道」爲什麼我不能返回沒有考慮我的響應類型是選項[JsValue]?「*使我認爲KimStebel正在做出正確的假設 –