选项[Map [String,String]]可以很奇怪地得到一个值

时间:2013-04-24 21:57:48

标签: scala scala-collections

我发现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”方法不会引起任何争论,所以这对我来说非常奇怪。它为什么有效?它是隐式转换还是错误?我想确定它是如何工作的。

我的规格是:

  • Scala版本2.9.2
  • Java 1.6.0_43

3 个答案:

答案 0 :(得分:12)

这对fileInfo.get.apply("type")感到厌倦,即你并没有真正将参数传递给Option#get,而是在结果上调用.apply("type")

答案 1 :(得分:4)

Scala允许您omit braces in some cases,并且您已成为此功能创建的歧义的受害者:您所做的只是简单的展开选项(并获取基础地图) - 选项不仅广泛使用{ {1}},但也有不安全的.getOrElse方法,当有None:

时,该方法会失败
.get

答案 2 :(得分:2)

fileInfo.get("type")

被翻译为:

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

因此,您打开该选项,然后在Map上获取一个元素。 (apply获取地图的元素是非可选的,即如果密钥不存在则失败。