2016-06-06 11 views
0

ich in einer Map[Int, String] Definition eine Verkettung von String litterals als Wert zu verwenden, ich versuche:definieren Map [Int, String] mit langen Strings als richtigen Wert

scala> val m: Map[Int, String] = Map(1 -> "a" + "b") 

aber ich bekomme die folgende Fehlermeldung aus sbt console

<console>:7: error: type mismatch; 
found : String 
required: (Int, String) 
     val m: Map[Int, String] = Map(1 -> "a" + "b") 

Der Grund, warum ich mag so etwas tun, weil ich Karten von einer ID zu einem gewissen Code definieren will, wie so:

Map(1 -> s"""SELECT year, COUNT(*) FROM""" + 
     s""" (SELECT id, YEAR(pb_date) AS year FROM Publications) AS Res1""" + 
     s"""GROUP BY year;""") 

, ohne dass für jeden Code-Snippet, der als Map right-Wert angezeigt wird, eine Zeichenfolge definiert werden muss.

Gibt es einen Weg, dies zu erreichen?

+1

Nebenbei bemerkt, eine Menge Leute betrachten SQL-String-Konstruktion als schlechte Form. Wenn Sie eine ID einer Funktion zuordnen möchten, können Sie genau das tun: Funktionen sind Werte in Scala, so dass Sie sie in Ihrer Map speichern können wie in [http://pastebin.com/ZE4ELrca] –

Antwort

5

Sie fehlen nur einige Klammern:

scala> val m: Map[Int, String] = Map(1 -> ("a" + "b")) 
m: Map[Int,String] = Map(1 -> ab) 

Der Grund, warum Sie diesen Fehler speziell bekommen, weil -> Vorrang vor + nimmt, was bedeutet, dass Sie tatsächlich (1 -> "a") + b erhalten, wie Sie unten sehen können:

scala> 1 -> "a" + "b" 
res4: String = (1,a)b 
+3

"wahrscheinlich"? Endgültig! – Bergi

+0

Ah ja, jetzt, wo ich darüber nachdenke, macht dieser Fehler Sinn –

Verwandte Themen