++:似乎不正确的关联?

时间:2019-03-10 01:01:26

标签: scala syntactic-sugar associativity

我正在尝试学习scala。我正在查看队列(https://www.scala-lang.org/api/current/scala/collection/immutable/Queue.html)的文档。

据我了解,以冒号结尾的方法是正确的关联。但是,对我来说,++:似乎不这样做:

committer.name

文档和实验似乎都表明++:不正确的关联。 ++和++的文档:先说左,再说右,这就是上面发生的事情,我只是不明白为什么。显然,我缺少一些东西。有人可以帮我澄清一下吗?

1 个答案:

答案 0 :(得分:4)

一个非常简单的实验:

case class A(s: String) { def ++:(a: A) = A(s"(${a.s} + ${s})") }
A("x") ++: A("y") ++: A("z")

给予:

A((x + (y + z)))

因此它是x + (y + z)而不是(x + y) + z。因此,++:是右关联的,如广告所示。

请注意,它是${a.s} + ${s},而不是${s} + ${a.s}。对于Queue,它可能类似于:

def ++:(left: Queue[A]): Queue[A] = left ++ this

因此,当您编写q0 ++: q1时,元素的顺序将显示为“应有的状态”,将其还原为q1.++:(q0),然后扩展为q0 ++ q1