2013-04-24 58 views
0

我發現Option[Map[String, String]]作品古怪的是這樣的:選項[地圖[字符串,字符串]]可以得到一個值古怪

scala> val fileInfo: Option[Map[String, String]] = Some(Map("type" -> "hoge")) 
fileInfo: Option[Map[String,String]] = Some(Map(type -> hoge)) 

scala> fileInfo.get("type") 
res1: String = hoge 

我認爲Option「get」方法不帶任何參數,所以這是超級怪異的我。它爲什麼有效?這是一個隱式轉換還是一個錯誤?我想確定它是如何工作的。

我的規格是:

  • 斯卡拉版本2.9.2
  • 的Java 1.6.0_43

回答

11

這desugars到fileInfo.get.apply("type"),即你是不是真的將參數傳遞給Option#get,但呼籲的結果.apply("type")

fileInfo.get().apply("type") 

所以你解開的選項,然後坐上Map元素:

+0

謝謝。我懂了。 – buster84 2013-04-24 23:48:02

4

斯卡拉讓你omit braces in some cases且該功能創建你一直含糊不清的受害者:你已經做了什麼只是簡單的解包選項(並得到底層的地圖) - 選項不僅廣泛使用.getOrElse,而且不安全的.get方法,當有無時會失敗,例外:

val fileInfo: Option[Map[String, String]] = Some(Map("type" -> "hoge")) 
val map = fileInfo.get 
// map: Map[String,String] = Map(type -> hoge) 
// now actual map lookup 
map("type") 
// res0: String = hoge 

// but this obviously won't work 
val throwy: Option[Map[String, String]] = Option(null) // None 
throwy.get("type") 
// java.util.NoSuchElementException: None.get 
+0

謝謝。是的,該代碼是由我的同事寫的。一旦我看到代碼,我就像發生車禍......在這種情況下,我不喜歡糖的語法,所以我勸他改變他的代碼,就像你的代碼片段。 – buster84 2013-04-24 23:58:39

2
fileInfo.get("type") 

來翻譯。 (apply獲取映射的元素是非可選的,即如果該鍵不存在則失敗)。

+0

謝謝。你的答案也很好,但接受的答案比你的答案快。 – buster84 2013-04-24 23:49:15

+0

@ buster84不用擔心:) – gzm0 2013-04-24 23:56:36

相關問題