2016-06-06 102 views
0

我試圖使用字符串litterals的串聯 如在Map[Int, String]定義值:定義地圖[詮釋,字符串]長字符串作爲權值

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

,但我得到以下錯誤sbt console

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

我之所以會想要做這樣的事情是因爲我想定義從ID映射到一些代碼,就像這樣:

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

而不必爲每個代碼片段定義一個字符串作爲Map右值。

有沒有辦法做到這一點?

+1

正如一邊,很多人認爲SQL字符串結構是差的形式。如果你想將一個id映射到一個函數,你可以這麼做:函數是Scala中的值,因此你可以將它們存儲在你的地圖中,像[this](http://pastebin.com/ZE4ELrca) –

回答

5

你只是缺少一些括號:

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

爲什麼你特別得到這個錯誤的原因是因爲->優先+,這意味着你實際上(1 -> "a") + b,你可以看到如下:

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

「很可能」?明確! – Bergi

+0

啊,現在我想起來了,那個錯誤很有意義 –

相關問題