2016-09-03 119 views
-1

我寫了下面的簡單程序如何正確連接字符串?

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 
    } 
} 

DEMO

我認爲該計劃將打印key1=value1 key2=value2 key3=value3 separator。但它確實沒有。相反,它會打印:

key1=value1 separatorkey2=value2 separatorkey3=value3 

爲什麼?我以爲我先建立了地圖的字符串表示,然後將separator添加到表示中。

+0

顯然'mkString'優先於'+',這有點奇怪但可以理解。使它們顯式方法調用或將它們包裝在括號中。 – Bergi

回答

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")也可以在詩歌類型斯卡拉寫成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 
+0

但美麗的代碼是更好的代碼! :-P你的情緒聽起來像是「真實的代碼」,需要很難閱讀 – Bergi

+1

最後的「代碼」(而不是「詩歌」)行有2個額外/不需要的'()'對。 – jwvh

+0

不,它不。任何'list.mkString(「ab」)+「cd」'都可以被Scala識別爲'list.mkString(「ab」)+「cd」',它將被解析爲list.mkstring((「ab」) +「cd」)。另外...即使從讀者的角度來看,對於這樣一個長期的陳述來說,括號使得代碼更具可讀性。 –