好吧,Scala让我感觉非常密集。我发现文档非常难以理解 - 更糟糕的是,你不能谷歌“Scala ++:”这个术语,因为谷歌放弃了运算符条款!
我正在阅读一些代码并看到了这一行:
Seq(file) ++: children.flatMap(walkTree(_))
但无法理解。 Seq
的文档显示了三件事:
++
++:
++:
后两个人超负荷做什么..某事。文档中的实际解释说它们与++
做同样的事情。即,将一个列表添加到另一个列表。
那么,运营商之间的区别到底是什么?
答案 0 :(得分:9)
++
和++:
会返回不同的结果。 ++
返回与左侧相同的集合类型,++:
返回与右侧相同的集合类型:
scala> List(5) ++ Vector(5)
res2: List[Int] = List(5, 5)
scala> List(5) ++: Vector(5)
res3: scala.collection.immutable.Vector[Int] = Vector(5, 5)
++:
有两个重载版本仅出于实现原因。 ++:
需要能够接受任何TraversableOnce
,但为Traversable
(TraversableOnce
的子类型)提供了一个重载版本以提高效率。
答案 1 :(得分:3)
只是为了确保:
方法名称末尾的冒号(:)会使调用颠倒过来。
让我们制作两种方法,看看会发生什么:
object Test {
def ~(i: Int) = null
def ~:(i: Int) = null //putting ":" in the tail!
this ~ 1 //compiled
1 ~: this //compiled
this.~(1) //compiled
this.~:(1) //compiled.. lol
this ~: 1 //error
1 ~ this //error
}
因此,在seq1 ++: seq2
中,++:
实际上是seq2
的方法。
编辑:正如@okiharaherbst所提到的,这称为正确的关联性。
答案 2 :(得分:1)
除非您学习一些简单的规则及其优先级,否则Scala函数命名看起来会很神秘。
在这种情况下,冒号意味着该函数具有右关联性,而不是您在命令式语言中看到的更常见的左关联性。
++:
与List(10) ++: Vector(10)
中的Vector(10).++:(List(10))
不是列表中的运算符,而是一个名为的函数,即使它出现在其上左手边,即它与++
相同并返回向量。
List(10) ++ Vector(10)
中的 List(10).++(Vector(10))
现在在列表中调用了函数(左关联性),即它与{{1}}相同并返回列表
答案 3 :(得分:0)
运营商之间到底有什么区别??
Seq.++
操作的列表类型。
def ++[B](that: GenTraversableOnce[B]): Seq[B]
def ++:[B >: A, That](that: Traversable[B])(implicit bf: CanBuildFrom[Seq[A], B, That]): That
def ++:[B](that: TraversableOnce[B]): Seq[B]
在" What is the basic collection type in Scala?"
中评论Traversable
扩展TraversableOnce
(整合Iterator
和Traversable
)和TraversableOnce
扩展GenTraversableOnce
(以序列集合和并行为单位。)