scala - 为什么 prepend 在 Seq 上的行为会有所不同,具体取决于您如何调用它?

标签 scala

如果我使用中缀表示法,我可以毫无问题地附加到不可变的 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" 有效,因为 StringIndexedSeq[Char] 并且您在此 String 前面添加一个 Seq(通过 Seq.apply 使用 List 作为默认实现),这样你就得到IndexedSeq[任意]

关于scala - 为什么 prepend 在 Seq 上的行为会有所不同,具体取决于您如何调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33573448/

相关文章:

java - 如何获取非 case 类的构造函数参数的默认值?

scala - 修改观察路径

scala - 在 Play 2.4 scala 中禁用单个测试

scala - 在选项中自动包装参数

scala - Scala 中方法、函数和部分应用函数的函数组合

inheritance - 实现不安全的 Java 接口(interface)

scala - 如何限制 Akka (2.1.2) 中的消息?

scala - json4s 总是转义 unicode 字符 €

scala - Spark : grouping rows in array by key

java - 如何从 scala 2.11 执行 BASH 源命令?