2010-05-11 429 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