Вот неявное преобразование:
implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)
Это преобразует любой тип в экземпляр "ArrowAssoc"
class ArrowAssoc[A](x: A) {
def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
}
Итак, когда Скала видит
"a"->1
Он говорит: «В String нет метода с именем« -> ». Существуют ли какие-либо неявные преобразования в области видимости, которые могут дать мне тип с методом« -> »? Predef.scala автоматически находится в области видимости и предлагает преобразование в ArrowAssoc, который, очевидно, имеет метод '->'. Затем Scala конвертирует вышеприведенное в
any2ArrowAssoc("a").->(1)
Этот метод возвращает Tuple2 ("a", 1) (часто называемый парой). Map имеет конструктор, который представляет собой массив (varargs) Tuple2s, так что мы отправляемся в гонки! Никакой магии в компиляторе (кроме неявного преобразования, которое широко используется и для самых разных целей) и никакой магии в конструкторе Maps.