/ / Čo je na tomto kúsku scala kódu zlé? - scala

Čo sa stalo s týmto kusom kódu Scala? - Scala

Mám nasledujúci útržok kódu, ktorý sa nedá kompilovať:

val cids = List(1, 2, 3, 4)
val b = Map.newBuilder[Int, Int]
for (c <- cids) {
b += (c, c*2)
}
b.result()

Kompilátor to hlási

console>:11: error: type mismatch;
found   : Int
required: (Int, Int)
b += (c, c*2)

Netuším, v čom je chyba.

odpovede:

7 pre odpoveď č. 1

To by fungovalo:

for (c <- cids) {
b += ((c, c*2))
}

Zátvorky sú kompilátorom analyzované ako zátvorky zoznamu argumentov += funkcie, a nie ako a tica. Pridanie vnorenej zátvorky znamená, že sa ako argument odovzdá n-tica. To je mätúce ...


5 pre odpoveď № 2

Môžete to opraviť nasledujúcim spôsobom:

b += (c->c*2)

2 pre odpoveď č. 3

Toto je duplicitná otázka.

Za normálnych okolností funguje dodanie nespracovaného zoznamu arg akozobrazené, ale nefunguje to, keď je metóda preťažená, pretože si vyberie metódu, ktorú ste nemali v úmysle, a nebude sa obťažovať vyskúšať automatické doladenie vašich args.

scala> class C[A] { def f(a: A) = 42 }
defined class C

scala> val c = new C[(String, Int)]
c: C[(String, Int)] = C@3a022576

scala> c.f("1", 1)
res0: Int = 42

scala> class C[A] { def f(a: A) = 42 ; def f(a: A, b: A, rest: A*) = 17 }
defined class C

scala> val c = new C[(String, Int)]
c: C[(String, Int)] = C@f9cab00

scala> c.f("1", 1)
<console>:14: error: type mismatch;
found   : String("1")
required: (String, Int)
c.f("1", 1)
^

2 pre odpoveď № 4

Prístup využívajúci (nemenné) hodnoty,

(cids zip cids.map(_ * 2)).toMap

Použitím zip spárujeme každú hodnotu s jej dvojnásobkom a výsledný zoznam sa prevedie na a Map.


0 pre odpoveď č. 5

Ak pôjdete do dokumentácie, nájdete: toto

Podporované API je ms += (k -> v) . To je potrebné použiť

for (c <- cids) {
b += (c -> c*2)
}

Prípadne môžete použiť ((c, c*2)) syntax, ako je navrhnuté vyššie.Deje sa to preto, lebo kompilátor nijako nevie, že zátvorky sú pre n-ticu. Proste chápe tento argument ako dva parametre odovzdávané metóde + =.