2010-05-11 116 views
4

当执行该代码:分配方法斯卡拉

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

我在这里看到的三(5?)分配。在这种情况下调用的方法调用的名称是什么? 运营商是否超载?

更新:
我可以创建类和重载分配吗? (X = Y不是X(1)= Y)

回答

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) 
+0

谢谢。非常有用的答案。 – 2010-05-11 14:27:34

9

补充0 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 
+0

这是如何工作的? 'val a:BigInt = 1'? – Jus12 2013-06-26 16:30:45

+0

@Amitabh这不是一个任务,而是一个声明,并且没有任何被覆盖的地方。什么是问题?那'1'不是'BigInt'?如果是这种情况,则可以从'Int'到'BigInt'进行隐式转换,以便在分配之前将该数字转换为BigInt。 – 2013-06-29 01:02:21

+0

是的,这是一个问题。我想做一个BigInt的变体(让我们称它为BI)。我无法弄清楚如何做这个隐式转换。 – Jus12 2013-06-29 20:07:53