/ / Mapas de Scala -> operador - scala, diccionario

Mapas de Scala -> operador - scala, diccionario

Que hace el simbolo -> significa en el contexto de un Map en scala?

Scala Predef La clase ofrece una conversión implícita que permite escribir key -> value como una sintaxis alternativa para el par (key, value). Lo leí en ScalaByExample pero no veo cómo funciona esto para Maps.

Respuestas

38 para la respuesta № 1

los -> operador es una abreviatura para asociar una clavecon un valor cuando se usa en el contexto de un mapa. En algunos idiomas, simplemente se le permite pasar el par de la clave y el valor (generalmente con la clave en la primera posición y el valor en la segunda) al constructor o uno de los diversos métodos en un mapa y se manejará apropiadamente: esto también está permitido con los mapas Scala.

sin embargo, Scala también proporciona la forma abreviada de key -> value, que, como has descubierto, se define enPredef vía un implícito, para que la asociación sea más clara. Esencialmente está diciendo: "toma el elemento a la izquierda y mapealo al elemento a la derecha". Si lees la definición del objeto Map, notarás que no define ningún método que obviamente use este -> método. En cambio, los métodos toman objetos de tipo Tuple2 (Esta es una tupla de 2 valores: p. (item1, item2)), que la implicidad de Scala convierte mediante el método de Predef.

En algunos idiomas, el -> La sintaxis se define como parte del lenguaje en sí, pero debido a la flexibilidad de Scala, esto se puede definir simplemente como un método.


65 para la respuesta № 2

Aquí está la conversión implícita:

implicit def any2ArrowAssoc[A](x: A): ArrowAssoc[A] = new ArrowAssoc(x)

Esto convertirá cualquier tipo en una instancia de "ArrowAssoc"

class ArrowAssoc[A](x: A) {
def -> [B](y: B): Tuple2[A, B] = Tuple2(x, y)
}

Entonces cuando Scala ve

"a"->1

Dice "No hay ningún método llamado" -> "en String. ¿Hay alguna conversión implícita en el alcance que pueda darme un tipo que tenga un método llamado "->"? "Predef.scala entra automáticamente en el alcance y ofrece una conversión a ArrowAssoc, que obviamente tiene el método" -> ". Scala entonces esencialmente convierte lo anterior a

any2ArrowAssoc("a").->(1)

Este método devuelve una Tuple2 ("a", 1) (a menudollamado un par). Map tiene un constructor que es una matriz (varargs) de Tuple2s, por lo que estamos listos para las carreras. No hay magia en el compilador (además de la conversión implícita, que se usa ampliamente y para muchos propósitos diferentes), y no hay magia en el constructor de Maps.


13 para la respuesta № 3

-> se usa para acoplar claves y valores para un mapa. Asi que:

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

asignará los primeros 3 enteros positivos en equivalentes de texto (es decir, m(1) estarán "one", etc.) También puedes escribirlo como

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

pero la primera forma se ve mejor, por eso se ofrece como una alternativa.


1 para la respuesta № 4

Como dijo Adam: -> no es sintaxis scala, es un método de la clase ArrowAssoc. Cuando escribe "foo" -> "bar", el compilador inserta una conversión implícita de "foo" a la instancia de ArrowAssoc para que el -> Se puede encontrar el método.

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 "para saber más.