在Scala中分配方法

时间:2010-05-11 10:48:38

标签: scala operator-overloading variable-assignment scala-2.8

执行此代码时:

var a = 24
var b = Array (1, 2, 3)
a = 42
b = Array (3, 4, 5)
b (1) = 42

我在这里看到三个(五个?)作业。在这种情况下调用的方法调用的名称是什么? 它是运算符重载吗?

更新
我可以创建一个类和重载分配吗? (x = y不是x(1)= y)

2 个答案:

答案 0 :(得分:16)

拥有此文件:

//assignmethod.scala
object Main {
  def main(args: Array[String]) {
    var a = 24
    var b = Array (1, 2, 3)
    a = 42
    b = Array (3, 4, 5)
    b (1) = 42
  }
}

正在运行scalac -print assignmethod.scala给我们:

[[syntax trees at end of cleanup]]// Scala source: assignmethod.scala
package <empty> {
  final class Main extends java.lang.Object with ScalaObject {
    def main(args: Array[java.lang.String]): Unit = {
      var a: Int = 24;
      var b: Array[Int] = scala.Array.apply(1, scala.this.Predef.wrapIntArray(Array[Int]{2, 3}));
      a = 42;
      b = scala.Array.apply(3, scala.this.Predef.wrapIntArray(Array[Int]{4, 5}));
      b.update(1, 42)
    };
    def this(): object Main = {
      Main.super.this();
      ()
    }
  }
}

正如您所看到的,编译器只是将最后一个(b (1) = 42)更改为方法调用:

b.update(1, 42)

答案 1 :(得分:9)

补充Michael's answer,无法在Scala中覆盖作业,但您可以创建类似作业的运算符,例如:=

可以覆盖的“作业”是:

// method update
a(x) = y 
// method x_=, assuming method x exists and is also visible 
a.x = y
// method +=, though it will be converted to x = x + y if method += doesn't exist
a += y