2012-01-18 32 views

cevap

11

Eğer Repl bunu yaparken, etkili yapıyoruz:

class Foobar { val b = a; val a = 5 } 

, b ve a b atıyorsanız anda öylesine bir orada, sırayla atanmış a ama henüz atamadı, bu nedenle varsayılan değeri 0'dır. Java'da bunu yapamazsınız, çünkü bir alan tanımlanmadan önce başvuruda bulunamazsınız. Tembel başlatmalara izin vermek için bunu Scala'da yapabileceğinize inanıyorum.

Sen daha net aşağıdaki kodu kullanabilirsiniz eğer bunu görebilirsiniz:

scala> class Foobar { 
    println("a=" + a) 
    val b = a 
    println("a=" + a) 
    val a = 5 
    println("a=" + a) 
} 
defined class Foobar 

scala> new Foobar().b 
a=0 
a=0 
a=5 
res6: Int = 0 

Eğer aa yöntemi yaparsanız atanan doğru değerlere sahip olabilir:

class Foobar { val b = a; def a = 5 } 
defined class Foobar 
scala> new Foobar().b 
res2: Int = 5 

veya ba tembel yapabilirsiniz val:

scala> class Foobar { lazy val b = a; val a = 5 } 
defined class Foobar 

scala> new Foobar().b 
res5: Int = 5 
+2

Scalac bu gibi durumlarda bir uyarı vermemeli midir? Emin bir böcek gibi görünüyor ve muhtemelen komik böceklere yol açacaktır. – Rogach

+0

@Rogach, Sanırım Scala derleyicisinde bir uyarı olabilir, ancak yararlı olabilir, özellikle. tembel değerlendirme için. Scalastyle (https://github.com/scalastyle/scalastyle) gibi bir stil denetleyicisinin alemlerinde daha fazlası. –

+0

@Rogach Bu gibi durumları algılamak, imkansız olmasa bile, zor bir şekilde zordur. Scalac'ın basit durumlar için muhtemelen uyarısı olacaktır. –