Scala中的AnyVal类型(Int,Double等)上的+ = / * = / etc运算符

时间:2009-11-12 03:03:26

标签: scala

为AnyVal的子类声明的* = / + = / etc方法究竟在哪里?我假设对这些类型做了一些特别的事情,因为作为一个val,它们是无效的但是作为var它们很好。这只是更多的合成糖吗?我认为它正在转向

a *= 5

a = a * 5

显然对val没有成功。这种直觉是否正确?我还假设它只为AnyVals尝试这个?

谢谢:)

2 个答案:

答案 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