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」メソッドは引数を取らないと思うので、これは私にとって非常に奇妙です。なぜそれが機能するのですか?それは暗黙の変換ですか、それともバグですか? 仕組みを確かめたい。

私の仕様は次のとおりです。

  • Scala バージョン 2.9.2
  • Java 1.6.0_43
4

3 に答える 3

12

これは に desugar しfileInfo.get.apply("type")ます。つまり、実際には にパラメータを渡しているのではなく、結果Option#getを呼び出しています。.apply("type")

于 2013-04-24T22:20:59.620 に答える
4

Scala では、場合によっては中括弧を省略できますが、この機能によって作成されたあいまいさの犠牲者になっています: あなたが行ったことは、単純にラップされていない Option (および基になる Map を取得する) です -- Option は広く使用されているだけ.getOrElseでなく、安全でもありません.getNone がある場合に例外で失敗するメソッド:

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 に答える