A def, a def, a val, a lazy valveya an ile uygulanabilir object. Dolayısıyla, bir üyeyi tanımlamanın en soyut şekli. Özellikler genellikle soyut arayüzler olduğundan, a istediğinizi valsöylemek , uygulamanın nasıl yapılması gerektiğini söylemektir. Bir istersen val, uygulama sınıfı bir def.
A val, yalnızca kararlı bir tanımlayıcıya ihtiyacınız varsa, örneğin yola bağımlı bir tür için gereklidir. Bu genellikle ihtiyacınız olmayan bir şeydir.
Karşılaştırmak:
trait Foo { def bar: Int }
object F1 extends Foo { def bar = util.Random.nextInt(33) }
class F2(val bar: Int) extends Foo
object F3 extends Foo {
lazy val bar = {
Thread.sleep(5000)
42
}
}
Olsaydı
trait Foo { val bar: Int }
F1veya tanımlayamazsınız F3.
Tamam, kafanızı karıştırmak ve @ om-nom-nom'u yanıtlamak için - özet vals kullanmak başlatma sorunlarına neden olabilir:
trait Foo {
val bar: Int
val schoko = bar + bar
}
object Fail extends Foo {
val bar = 33
}
Fail.schoko
Bu, benim kişisel görüşüme göre, gelecekteki Scala sürümlerinde onu derleyicide düzelterek ortadan kaldırması gereken çirkin bir sorundur, ancak evet, şu anda bu aynı zamanda soyut vals kullanılmaması için bir nedendir .
Düzenleme (Ocak 2016): valBir lazy valuygulama ile soyut bir bildirimi geçersiz kılmanıza izin verilir , böylece başlatma hatasını da önler.