は、それは正確に何が起こっているかを確認するためにscala.Predef
で見てみるのに役立ちます。
スカラのString
がjava.lang.String
のエイリアスにすぎないことがわかります。換言すれば、String
の+
メソッドは、Javaの+
演算子に変換されます。
Scala String
がちょうどJava String
の場合、++
メソッドはどのように存在するのでしょうか。答えは、少なくともにあるwrapString
メソッドによって提供されるString
からWrappedString
への暗黙的な変換があるということです。
++
はGenTraversableOnce
のインスタンスをすべて取り、そのインスタンスのすべての要素を元のWrappedString
に追加します。 (ドキュメントにはWrappedString[B]
が返されていることが間違っていることに注意してください。WrappedString
はタイプパラメータを取らないため、これは間違っています)。返すものはString
です(追加するものがSeq[Char]
の場合)またはIndexedSeq[Any]
(そうでない場合)です。ここで
は、いくつかの例は以下のとおりです。
あなたはList[Char]
にString
を追加する場合は、文字列を取得します。
scala> "a" ++ List('b', 'c', 'd')
res0: String = abcd
あなたはList[String]
にString
を追加する場合は、IndexedSeq[Any]
を取得します。実際、最初の2つの要素はChar
ですが、後の3つはString
です(フォローアップコールが示すように)。あなたはString
++
とString
に追加した場合
scala> "ab" ++ List("c", "d", "e")
res0: scala.collection.immutable.IndexedSeq[Any] = Vector(a, b, c, d, e)
scala> res0 map ((x: Any) => x.getClass.getSimpleName)
res1: scala.collection.immutable.IndexedSeq[String] = Vector(Character, Character, String, String, String)
最後に、あなたが戻ってString
得ます。この理由は、WrappedString
継承IndexedSeq[Char]
から、ので、これはバックSeq[Char]
あなたを与えるSeq[Char]
にSeq[Char]
を追加する複雑な方法であるということです。
scala> "abc" + "def"
res0: String = abcdef
アレクセイが指摘したように、これらのいずれも非常に微妙なツールであり、そうでないと十分な理由がありますしない限り、あなたはおそらくstring interpolationまたはStringBuilder
を使用して方がいいでしょう。
出典
2015-10-12 07:02:50
TOB
、私はもはや '+'使用しないことをお勧めします。おそらく廃止され、最終的に削除されます。スカラには文字列を補間する方法があります。 '++'を使うことは遅くなるかもしれませんが、私はそれが構文上明確で、Scalaのコレクションと一線を画した良い選択肢だと思います。 –
@ 0__ 2時間前、+はJava文字列の権利ですか?その場合、ScalaはScala文字列を保持していますか? –
'+'は 'java.lang.String' APIで定義されていません。Javaでは文字列ビルダーを実行するための単なる構文糖です。これはScalaでも同じです。ここでは 'Predef.any2stringadd'がなくても' + 'を使ったStringカテネーションがコンパイラによって定義されています。以下も参照してください:https://stackoverflow.com/questions/2664274/how-to-unimport-string-operator-in-scala –