我对scala很新。我浏览了这本书,并在代码中绊倒了这两个操作符。他们做了什么?
答案 0 :(得分:14)
在Scala中使用运算符时会有一些语法糖。
考虑一个运营商*
。当编译器遇到a *= b
时,它将检查*=
上是否定义了方法a
,并在可能的情况下调用a.*=(b)
。否则表达式将扩展为a = a.*(b)
。
但是,任何以:
结尾的运算符在转换为方法调用时都会交换左右参数。因此a :: b
变为b.::(a)
。另一方面,a ::= b
变为a = a.::(b)
,由于缺少订单撤销,这可能是违反直觉的。
由于特殊含义,无法定义运算符:
。因此:
与其他符号结合使用,例如:=
。
Scala中的运算符由库编写者定义,因此它们可能意味着不同的东西。
::
运算符通常用于列表连接,a ::= b
表示take a, prepend b to it, and assign the result to a
。
a := b
通常表示set the value of a to the value of b
,而a = b
则会导致the reference a to point to object b
。
答案 1 :(得分:3)
这将调用左侧对象上的方法:
或::
,右侧的对象作为参数,并将结果分配给左侧的变量
foo ::= bar
相当于
foo = foo.::(bar)
请参阅对象类型的:
或::
方法的文档。
(对于集合,::
方法会将一个元素附加到列表的开头。)