/ / Scala maps -> оператор - scala, речник

Scala карти -> оператор - скала, речник

Какво означава символа -> означава в контекста на a Map в Скала?

Скала Predef клас предлага имплицитно преобразуване, което позволява едно писане key -> value като алтернативен синтаксис за двойката (key, value), Прочетох го в ScalaByExample, но не успях да видя как работи това за Карти.

Отговори:

38 за отговор № 1

Най- -> оператор е стенограма за свързване на ключсъс стойност, когато се използва в контекста на карта. На някои езици ви е просто позволено да предавате двойката ключ и стойност (обикновено с ключа на първа позиция и стойността във втората) на конструктора или един от различните методи на карта и те ще бъдат обработвани по подходящ начин - това е разрешено и с карти Scala.

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

На някои езици -> синтаксисът се дефинира като част от самия език, но поради гъвкавостта на Scala това може да бъде определено просто като метод.


65 за отговор № 2

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

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, който очевидно има метода" -> ". след това по същество преобразува горното в

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

Този метод връща Tuple2 ("a", 1) (честонаречена двойка). Map има конструктор, който е масив (varargs) от Tuple2s, така че ние "се връщаме към състезания! Няма магия в компилатора (освен неявно преобразуване, което се използва широко и за много различни цели), и няма магия в конструктора на Maps.


13 за отговор № 3

-> се използва за свързване на ключове и стойности за карта. Така:

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

ще картографира първите 3 положителни числа в текстови еквиваленти (т.е. m(1) ще бъде "one"и т.н.). Можете също така да го напишете като

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

но първият начин изглежда по-хубав, поради което се предоставя като алтернатива.


1 за отговор № 4

Както каза Адам, -> не е скала синтаксис, това е метод на класа 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 богати опаковки ", за да знаете повече.