A def
, a def
, a val
, a lazy val
veya 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 val
sö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 }
F1
veya tanımlayamazsınız F3
.
Tamam, kafanızı karıştırmak ve @ om-nom-nom'u yanıtlamak için - özet val
s 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 val
s kullanılmaması için bir nedendir .
Düzenleme (Ocak 2016): val
Bir lazy val
uygulama ile soyut bir bildirimi geçersiz kılmanıza izin verilir , böylece başlatma hatasını da önler.