scala 一个右结合的三重冒号运算符

yquaqz18  于 2022-11-09  发布在  Scala
关注(0)|答案(2)|浏览(128)

尽管三重冒号是右结合运算符,但下面的结果表明这不是真的,对吗?

List(3, 4, 5) ::: List(18, 19, 20) //> List[Int] = List(3, 4, 5, 18, 19, 20)

在我看来,结果应该是List(18, 19, 20, 3, 4, 5),因为它等同于说:

List(18, 19, 20).:::(List(3, 4, 5))

我理解正确联想错误的定义了吗?

nhjlsmyf

nhjlsmyf1#

从文档中:

def :::(prefix: List[A]): List[A]
[use case] Adds the elements of a given list in front of this list.

示例:

List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4)
prefix  - The list elements to prepend.
returns - a list resulting from the concatenation of the given list prefix and this list.

这说明了一切。至于右联想运算,你是对的。

5f0d552i

5f0d552i2#

关联性在表达式中不相关

x ::: y

:::的关联性决定了

x ::: y ::: z

被解释为(如果是左联)

( x ::: y ) ::: z

或AS(如果是右关联)

x ::: ( y ::: z )

因为在Scala中,所有以冒号结尾的运算符都是右关联的,所以使用后一种解释:假设x、y、z是LIST类型的变量,首先将y放在z前面,然后将x放在它前面。

相关问题