2013-04-24 2 views
0

Я нашел Option[Map[String, String]] работы причудливо, как это:Опция [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 «получить» метод не принимает никаких аргументов, так что это супер странно для меня. Почему это работает? Это неявное преобразование или ошибка? Я хочу убедиться, как это работает.

Мои характеристики:

  • Scala версия 2.9.2
  • Java 1.6.0_43

ответ

11

Это desugars к fileInfo.get.apply("type"), то есть вы на самом деле не передавая параметр в Option#get, но называть .apply("type") на результат.

+0

Спасибо. Я понял. – buster84

4

Scala позволяет 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

2
fileInfo.get("type") 

переводится на:

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

Таким образом, вы разворачивать опцию, а затем получить элемент на Map. (apply получает элемент карты, не являющийся необязательным, то есть сбой, если ключ не существует).

+0

Спасибо. Ваш ответ тоже хорош, но принятый ответ быстрее вашего. – buster84

+0

@ buster84 не беспокоится :) – gzm0