2016-06-06 119 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

啊,现在我想起来了,那个错误很有意义 –

相关问题