gpt4 book ai didi

scala - 为什么 Scala 中的对象表示法显然消除了以 ':' 结尾的方法的右侧关联性?

转载 作者:行者123 更新时间:2023-12-01 07:14:47 25 4
gpt4 key购买 nike

我目前正在学习 Scala,想知道在调用以“:”结尾的方法时使用对象表示法的不同之处。由于以“:”结尾的方法名称通常会产生右侧关联性,因此在使用对象表示法调用此类方法时,这似乎会发生变化。

例子:

scala> 3 +: List(1,2) 
res1: List[Int] = List(3, 1, 2)

scala> List(1,2) +: 3 // does not compile due to right side associativity

scala> (List(1,2)).+:(3)
res2: List[Int] = List( 3, 1, 2)

现在我不明白为什么使用对象表示法会禁用右关联性功能。有人可以对此进行解释或链接到有关此问题的文档吗?

最佳答案

来自 the spec , "中缀操作":

The associativity of an operator is determined by the operator's last character. Operators ending in a colon `:' are right-associative. All other operators are left-associative.

方法 +: 是在 List 上定义的,这就是 (List(1,2)).+:(3) 起作用的原因。它的实现是元素放在前面,所以等同于 3::List(1, 2),但这在这里无关紧要。

使用 infix 表示法 List(1,2) +: 3 将不起作用,因为(如规范中所述)所有以冒号结尾的中缀运算符都是right-associative,这意味着“右侧”使用以“左侧”作为参数的运算符,而不是相反。

基本上,

1 +: 2 +: 3 +: List(4, 5) 

List(4, 5).+:(3).+:(2).+:(1)

具有相同的效果(我知道这在您的问题中已经非常明显,但我只是强调右结合性)。

因此,用一个简单的句子来回答您的问题:不是在对象表示法中删除右侧结合性,而是在中缀表示法中添加 , 但仅适用于以冒号结尾的方法。

关于scala - 为什么 Scala 中的对象表示法显然消除了以 ':' 结尾的方法的右侧关联性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49554389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com