Scala 斯卡拉:你做什么=&引用;“和”:=&引用;接线员怎么办?

Scala 斯卡拉:你做什么=&引用;“和”:=&引用;接线员怎么办?,scala,operator-keyword,Scala,Operator Keyword,我刚接触scala。我浏览了一下这本书,无意中发现了这两个操作符的代码。它们是做什么的?这将调用左侧对象上的方法:或:,将右侧的对象作为参数,并将结果分配给左侧的变量 foo ::= bar 相当于 foo = foo.::(bar) 有关对象类型的:或:方法,请参阅文档 (对于集合,:方法在列表的开头追加一个元素。) 在Scala中使用运算符时,会有一些语法上的糖分 考虑一个操作符*。当编译器遇到a*=b时,它将检查方法*=是否在a上定义,并在可能的情况下调用a.*=(b)。否则表达式将展

我刚接触scala。我浏览了一下这本书,无意中发现了这两个操作符的代码。它们是做什么的?

这将调用左侧对象上的方法
,将右侧的对象作为参数,并将结果分配给左侧的变量

foo ::= bar
相当于

foo = foo.::(bar)
有关对象类型的
方法,请参阅文档

(对于集合,
方法在列表的开头追加一个元素。)

在Scala中使用运算符时,会有一些语法上的糖分

考虑一个操作符
*
。当编译器遇到
a*=b
时,它将检查方法
*=
是否在
a
上定义,并在可能的情况下调用
a.*=(b)
。否则表达式将展开为
a=a.*(b)

但是,任何以
结尾的运算符在转换为方法调用时都将交换左右参数。所以
a::b
变成
b.::(a)
。另一方面,
a::=b
变为
a=a.:(b)
,这可能是由于缺少顺序反转而违反直觉的

由于特殊含义,无法定义运算符
。因此
与其他符号一起使用,例如
:=

运算符的含义 Scala中的运算符由库编写者定义,因此它们可以表示不同的含义

::
运算符通常用于列表串联,而
a::=b
表示
取a,在b前面加上前缀,然后将结果分配给a


a:=b
通常意味着
将a的值设置为b的值,而不是
a=b
,这将导致
引用a指向对象b

这取决于左侧对象的类型。我找到了代码,下面或上面没有解释。因为Scala是强类型的,所以应该能够推断表达式的类型。+1到arnaud。中缀方法调用可能会有帮助。@arnaud576875您应该提到,如果
foo
的静态类型定义了它,它将首先尝试在
foo
上调用名为
:=
的方法,然后返回到您描述的方法。