"test " ++ "1"
而且我已经测试了,也写在Scala Doc
"test " + "1"
所以我的理解就是像Java字符串那样更强大,可以接受更多的参数类型.也似乎是普遍的其他事情像列表.我想知道我的理解是否正确.和其他任何差异?什么时候应该一个又一个只是为了字符串连接?
解决方法
scala.Predef
看看究竟发生了什么.
如果你检查那里,你会发现Scala中的String只是java.lang.String的一个别名.换句话说,String上的方法被转换为Java的运算符.
所以,如果一个Scala字符串只是一个Java字符串,该方法如何存在,你可能会问. (嗯,我至少会问,)答案是,由RectString方法提供的String到WrappedString的一个隐式转换,也是在Predef中.
请注意,需要任何GenTraversableOnce实例,并将该实例中的所有元素添加到原始的WrappedString中. (请注意,文档不正确地声明该方法返回一个WrappedString [B],这必须是不正确的,因为WrappedString不会使用类型参数.)你会得到的是一个String(如果你添加的东西是一个Seq [Char])或一些IndexedSeq [Any](如果不是).
这里有些例子:
如果你添加一个字符串到列表[Char],你会得到一个字符串.
scala> "a" ++ List('b','c','d') res0: String = abcd
如果你添加一个String到List [String],你得到一个IndexedSeq [Any].事实上,前两个元素是Chars,但最后三个是Strings,如后续调用所示.
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,你会得到一个String.这样做的原因是WrappedString继承自IndexedSeq [Char],所以这是一个复杂的方法,将Seq [Char]添加到Seq [Char]中,这样可以让您返回Seq [Char].
scala> "abc" + "def" res0: String = abcdef
正如Alexey所说,这些都不是一个非常微妙的工具,所以你可能更喜欢使用string interpolation或StringBuilder
,除非有很好的理由不要.