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
4

3 回答 3

12

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

于 2013-04-24T22:20:59.620 回答
4

Scala 允许您在某些情况下省略大括号,而您一直是该功能创建的模棱两可的受害者:您所做的只是展开 Option(并获取底层 Map)—— Option 不仅广泛使用.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
于 2013-04-24T22:00:40.957 回答
2
fileInfo.get("type")

被翻译成:

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

因此,您打开选项,然后在Map. (apply获取非可选的映射元素,即如果键不存在则失败)。

于 2013-04-24T22:23:49.800 回答