11

Scalaの暗黙的な変換メカニズムを使用した次の状況を誰かに説明してもらえますか。コードがあります:

object Main {
  implicit val x:Int => String = v => "val"
  implicit def y(v:Int) = "def"

  def p(s:String) = print(s)

  def main(args: Array[String]): Unit = {
      p(1)
  }
}

このコードは「val」を出力します。しかし、2行目にコメントすると:

//implicit val x:Int => String = v => "val"

コードは「def」を出力します。

したがって、この状況では両方の暗黙的な変換 (x と y) が可能です。あいまいさのない規則があります。挿入できる変換が他にない場合にのみ、暗黙的な変換が挿入されます。この規則によれば、このコードはまったくコンパイルされるべきではありません。しかし、コードは正常にコンパイルおよび実行されます。何がわからないのですか?

ありがとう。

4

1 に答える 1

10

この理由は、Scala 言語仕様セクション 6.26.2 に記載されています。

メソッドを関数として扱う前に、eta 展開を実行して関数に変換する必要があります。したがって、もう 1 つの暗黙的な変換を適用する必要があるため、valが選択されます。

更新: 欠陥のある例を削除しました。

パラメータのないメソッドの評価は、常に暗黙的に実行されます。

于 2010-10-18T20:24:07.180 に答える