为AnyVal的子类声明的* = / + = / etc方法究竟在哪里?我假设对这些类型做了一些特别的事情,因为作为一个val,它们是无效的但是作为var它们很好。这只是更多的合成糖吗?我认为它正在转向
a *= 5
到
a = a * 5
显然对val没有成功。这种直觉是否正确?我还假设它只为AnyVals尝试这个?
谢谢:)
答案 0 :(得分:9)
你的直觉是正确的。对于任何类,不仅是AnyVal
的子类,如果分配方法不存在,那么a OP= b
也会变为a = a OP b
。请注意,在这种情况下,OP
必须是非字母数字字符。
这在Scala Reference(Scala规范)第6.12.4节中有描述。
答案 1 :(得分:0)
Foo的简短游戏:
class Foo (val v: String, val n: String) {
override def toString : String = v + " : " + n
def #: (i: Int) : Foo = {
new Foo (v.substring (i), n.substring (i)) }}
var foo = new Foo ("Martin", "Odersky")
scala> foo #:= 2
scala> foo
res30: Foo = rtin : ersky
scala> foo #:= 2
scala> foo
res32: Foo = in : sky
scala> foo #:= 2
scala> foo
res34: Foo = : y