Bu örnekte neden hiçbir hata atılmıyor ve b varsayılan değeri tutuyor?Scala değerleri sıfırlama
scala> val b = a; val a = 5
b: Int = 0
a: Int = 5
Bu örnekte neden hiçbir hata atılmıyor ve b varsayılan değeri tutuyor?Scala değerleri sıfırlama
scala> val b = a; val a = 5
b: Int = 0
a: Int = 5
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
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
@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ı. –
@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. –