Вопрос о неявных преобразованиях Scala Правило не двусмысленности - PullRequest
11 голосов
/ 18 октября 2010

Может ли кто-нибудь объяснить мне следующую ситуацию с механизмом неявных преобразований 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". Но когда я комментирую вторую строку:

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

код печатает "def".

Таким образом, в этой ситуации возможны оба неявных преобразования (x и y). Существует правило не-неоднозначности - неявное преобразование вставляется, только если нет другого возможного преобразования для вставки. Согласно этому правилу этот код вообще не должен компилироваться. Но код успешно скомпилирован и выполнен. Что я не понимаю?

Спасибо.

1 Ответ

9 голосов
/ 19 октября 2010

Причина этого указана в разделе 6.26.2 Спецификации языка Scala.

Прежде чем метод можно будет рассматривать как функцию, его необходимо преобразовать в функцию, выполнив eta-расширение. Таким образом, необходимо применить еще одно неявное преобразование и выбрать val.

ОБНОВЛЕНИЕ : удален некорректный пример.

Оценка метода без параметров всегда выполняется неявно.

...