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ď č. 1To 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 + =.