2016-11-18 194 views
2
package Controls 

object TestBreak extends App { 

    def values = { 
    x1 = x 
    y1 = y 
    } 

    val (x, y) = (1, 2) 

    values 

    var (x1, y1) = (2, 3) 

    println((x, y)) 

    println((x1, y1)) 

} 

我在這裏可以看到,程序執行成功,沒有任何錯誤。scala變量初始化

當我打電話方法甚至變量X1,Y1的intialization前,..

  1. 如何處理階這種情況下?
  2. 怎樣的彙編代碼走。安迪?

回答

0
應用

延伸DelayedInit

作爲App延伸DelayedInitMain延伸App。在Main構造函數代碼執行的延遲初始化的一部分。在介紹init如何工作之前,讓我們看看構造函數變量聲明和方法變量聲明之間的差異。

scala> class A { 
    | def a(): Unit = { println(b) } 
    | val b = 1 
    | } 
defined class A 

在上面的例子b稍後將聲明和功能a()首先聲明。因爲它是Compiler類的構造函數接受它的。

scala> def x: Int = { 
    | def y: Int = z 
    | val z = 1 
    | y 
    | } 
<console>:12: error: forward reference extends over definition of value z 
     def y: Int = z 
       ^

在上述情況下編譯器抱怨說,它的前向參考。延遲初始化

已被棄用

類和對象(但要注意,不能性狀)繼承DelayedInit標記性狀將有如下的初始化代碼重寫:代碼變得delayedInit(代碼)。

初始化代碼包括所有語句和在初始化期間執行的所有值定義。

實施例:

trait Helper extends DelayedInit { 
    def delayedInit(body: => Unit) = { 
    println("dummy text, printed before initialization of C") 
    body // evaluates the initialization code of C 
    } 
} 

class C extends Helper { 
    println("this is the initialization code of C") 
} 

object Test extends App { 
    val c = new C 
} 

應導致以下被打印:

dummy text, printed before initialization of C 
this is the initialization code of C 
+0

閱讀更多關於延遲的init從這裏(http://www.scala-lang.org/api/current /scala/DelayedInit.html) – pamu