Скала карты -> оператор - PullRequest
       5

Скала карты -> оператор

34 голосов
/ 12 февраля 2011

Что означает символ -> в контексте Map в Scala?

Класс Predef в Scala предлагает неявное преобразование, позволяющее записать key -> value в качестве альтернативного синтаксиса дляпара (key, value).Я прочитал его в ScalaByExample, но не вижу, как это работает для Карт.

Ответы [ 4 ]

69 голосов
/ 13 февраля 2011

Вот неявное преобразование:

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.

47 голосов
/ 13 февраля 2011

Оператор -> - это сокращение, связывающее ключ со значением при использовании в контексте карты.В некоторых языках вам просто разрешено передать пару ключа и значения (обычно с ключом в первой позиции и значением во второй) конструктору или одному из различных методов на карте, и это будет обработаносоответственно - это также разрешено с картами Scala.

Однако , Scala также предоставляет сокращенную форму key -> value, которая, как вы обнаружили, определяется в Predef посредством неявного, чтобы сделать ассоциацию более ясной.По сути, он говорит: «возьмите предмет слева и сопоставьте его с предметом справа».Если вы прочитаете определение объекта Map, вы заметите, что он не определяет методы, которые явно используют этот метод ->.Вместо этого методы берут объекты типа Tuple2 (это кортеж из 2 значений: например, (item1, item2)), который простота Scala преобразует с помощью метода из Predef.

В некоторых языках ->синтаксис определяется как часть самого языка, но благодаря гибкости Scala его можно определить просто как метод.

14 голосов
/ 13 февраля 2011

-> используется для связывания ключей и значений для карты. Итак:

val m = Map(1 -> "one", 2 -> "two", 3 -> "three")

отобразит первые 3 натуральных числа в текстовые эквиваленты (то есть m(1) будет "one" и т. Д.). Вы также можете написать это как

val m = Map((1,"one"), (2,"two"), (3,"three"))

но первый способ выглядит лучше, поэтому он предоставляется в качестве альтернативы.

1 голос
/ 03 мая 2015

Как сказал Адам, -> - это не синтаксис scala , это метод класса ArrowAssoc. Когда вы пишете "foo" -> "bar", компилятор вставляет неявное преобразование из "foo" в экземпляр ArrowAssoc, чтобы можно было найти метод ->.

package scala
object Predef {
   class ArrowAssoc[A](x: A) {
       def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
      }
      implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] =
        new ArrowAssoc(x)
      ...
}

google "“ scala rich wrappers ”, чтобы узнать больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...