2016-09-03 4 views
-1

Ich schrieb das folgende einfache ProgrammWie verkette ich die Zeichenfolge richtig?

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

Ich dachte, das Programm key1=value1 key2=value2 key3=value3 separator drucken. Aber es tut nicht gut. Stattdessen druckt es:

key1=value1 separatorkey2=value2 separatorkey3=value3 

Warum? Ich dachte, ich baute zuerst eine String-Repräsentation der Karte und fügte dann separator zur Repräsentation hinzu.

+0

Anscheinend 'mkString' hat Vorrang vor' + ', was ein bisschen komisch aber verständlich ist. Machen Sie sie zu expliziten Methodenaufrufen oder umschließen Sie sie in Klammern. – Bergi

Antwort

0

Ein sehr ernster Hinweis :: Obwohl Scala Ihnen erlaubt, Code in einer Englisch-ähnlichen Weise zu schreiben, list map { case a => a toString } anstelle von list.map({ case a => a.toString }), tun Sie das nur, wenn es nicht mehrdeutig ist.

Oder ich werde sogar sagen, tun Sie das überhaupt nicht. Du schreibst Code nicht Poesie.

Hier ist Ihre Probleme wegen der Verwendung von Klammern nicht ordnungsgemäß und scala missverstanden Ihre Absichten.

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

Denken Sie daran, dass list.mkString(" " + "ABC") auch als list.mkString " " + "ABC" in der Dichtung Typ Scala geschrieben werden können.

+0

Aber schöner Code ist besser Code! :-P Ihre Stimmung klingt wie "echter Code" müsste schwer zu lesen sein – Bergi

+1

Die abschließende "Code" (nicht "Poesie") Zeile hat 2 extra/nicht benötigte Paare von '()'. – jwvh

+0

Nein, tut es nicht. Beliebige 'list.mkString (" ab ") +" cd "' können für Scala mehrdeutig gemacht werden als 'list.mkString (" ab ") +" cd "' was als list.mkstring (("ab") geparst wird + "CD"). Auch ... Auch aus einer Leserperspektive machen Klammern für eine lange Aussage mehr lesbaren Code. –