質問

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)が可能です。があります 非曖昧性ルール - 暗黙的な変換は、挿入する他の可能な変換がない場合にのみ挿入されます。この規則によれば、このコードはまったくコンパイルされるべきではありません。ただし、コードは正常にコンパイルおよび実行されます。何がわかりませんか?

ありがとう。

役に立ちましたか?

解決

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

メソッドを関数として扱う前に、ETA拡張を実行することにより、1つに変換する必要があります。したがって、もう1つの暗黙の変換を適用する必要があり、したがって val 選択されています。

アップデート: :欠陥のある例を削除しました。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top