我写了以下简单程序
object Main extends App {
println(new MyClass toString)
}
class MyClass {
var pairs: Map[String, String] = Map[String, String](
"key1" -> "value1",
"key2" -> "value2",
"key3" -> "value3"
)
val Separator = "separator"
override def toString = {
pairs map { case (key, value) => s"$key=$value" } mkString(" ") + Separator
}
}
我认为该程序会打印key1=value1 key2=value2 key3=value3 separator
。但它确实没有。相反,它打印:
key1=value1 separatorkey2=value2 separatorkey3=value3
为什么呢?我以为我首先构建了地图的字符串表示,然后将separator
添加到表示中。
答案 0 :(得分:0)
一个非常严重的建议::尽管Scala允许您以更英语的方式编写代码,list map { case a => a toString }
而不是list.map({ case a => a.toString })
,但只有在不明确的情况下才能执行此操作。
或者我甚至会说完全不这样做。你写代码不是诗歌。
这里你的问题是由于没有正确使用括号而scala误解了你的意图。
// this line of yours
pairs map { case (key, value) => s"$key=$value" } mkString(" ") + Separator
//is understood by Scala as
(pairs map { case (key, value) => s"$key=$value" }) mkString " " + Separator
请记住,list.mkString(" " + "ABC")
也可以在诗歌类型Scala中写成list.mkString " " + "ABC"
。
// so... if you want your result then better write things clearly with parenthesis
((pairs map { case (key, value) => s"$key=$value" }) mkString(" ")) + Separator
// Or just stop writing poetry and start writing code
(pairs.map({ case (key, value) => s"$key=$value" }).mkString(" ")) + Separator