如果我使用中缀表示法,我可以毫无问题地附加到不可变的 Seq
:
scala> Seq("b", "c") :+ "d"
res2: Seq[String] = List(b, c, d)
但是如果我尝试前置,它会将 String
实例视为 Seq
本身,结果会有所不同:
scala> Seq("b", "c") +: "a"
res3: scala.collection.immutable.IndexedSeq[Any] = Vector(List(b, c), a)
但是,以经典方式调用该方法会实现“预期”的效果:
scala> Seq("b", "c").+:("a")
res4: Seq[String] = List(a, b, c)
为什么会这样,什么方法应该有特权将 String
元素添加到 Seq[String]
(惯用的 scala)?
Environment:
Welcome to Scala version 2.11.6 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79).
最佳答案
每个以冒号 (:
) 结尾的方法在中缀表示法中使用时都是右关联的。
所以你需要执行"a"+: Seq("b", "c")
。
Seq("b", "c") +: "a"
有效,因为 String
是 IndexedSeq[Char]
并且您在此 String
前面添加一个 Seq
(通过 Seq.apply
使用 List
作为默认实现),这样你就得到IndexedSeq[任意]
。
关于scala - 为什么 prepend 在 Seq 上的行为会有所不同,具体取决于您如何调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573448/