2016-09-03 13 views
-1

は、私はプログラムがkey1=value1 key2=value2 key3=value3 separatorを印刷するだろうと思った次の簡単なプログラム文字列を正しく連結する方法は?

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 separatorkey2=value2 separatorkey3=value3 

なぜですか?最初に地図の文字列表現を作成してから、separatorを表現に追加したと思いました。

+0

明らかに 'mkString'は' + 'よりも優先されます。これはちょっと変わっていますがわかりやすいです。それらを明示的なメソッド呼び出しにするか、カッコで囲みます。 – Bergi

答えて

0

1つの非常に重要なアドバイス:: Scalaでは、英語のような方法でコードを書くことができますが、list.map({ case a => a.toString })の代わりにlist map { case a => a toString }のようにコードを書くことはできますが、あいまいでない場合にのみ行ってください。

また、私はそれを全くしないと言うでしょう。あなたは詩ではないコードを書いています。

あなたの問題は、かっこを適切に使用していないことに起因し、スカラーはあなたの意図を誤解しています。

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

しかし、美しいコードは良いコードです! :-Pあなたのセンチメントは "実コード"のように聞こえます。読みにくくする必要があります。 – Bergi

+1

"コード"( "詩"ではない)行には、2つの余分な/不要なペアの '()'があります。 – jwvh

+0

いいえ、そうではありません。 List.mkString( "ab")+ "cd" 'は、list.mkstring((" ab ")として解析される' list.mkString( "ab")+ "cd" 'としてScalaに対してあいまいになることがあります。 + "cd")。また...読者の視点からも、このような長い記述のために、括弧はより読みやすいコードを作成します。 –

関連する問題