Arasındaki fark nedir "def" ve "val" bir fonksiyonu tanımlamak için
Arasındaki fark nedir:
def even: Int => Boolean = _ % 2 == 0
ve
val even: Int => Boolean = _ % 2 == 0
Her iki even(10)
gibi çağrılabilir.
CEVAP
Yöntem def even
çağrı değerlendirir ve yeni bir işlev her zaman (Function1
yeni örneği) oluşturur.
def even: Int => Boolean = _ % 2 == 0
even eq even
//Boolean = false
val even: Int => Boolean = _ % 2 == 0
even eq even
//Boolean = true
def
Her çağrıda yeni bir fonksiyon olsun
val test: () => Int = {
val r = util.Random.nextInt
() => r
}
test()
// Int = -1049057402
test()
// Int = -1049057402 - same result
def test: () => Int = {
val r = util.Random.nextInt
() => r
}
test()
// Int = -240885810
test()
// Int = -1002157461 - new result
val
çağrıldığında tanımlı zaman değerlendirir, def
-:
scala> val even: Int => Boolean = ???
scala.NotImplementedError: an implementation is missing
scala> def even: Int => Boolean = ???
even: Int => Boolean
scala> even
scala.NotImplementedError: an implementation is missing
Üçüncü bir seçenek olduğunu unutmayın: lazy val
.
İlk defa aradığında değerlendirir:
scala> lazy val even: Int => Boolean = ???
even: Int => Boolean = <lazy>
scala> even
scala.NotImplementedError: an implementation is missing
Ama aynı sonuç (FunctionN
Bu durumda aynı örneği) her zaman döndürür:
lazy val even: Int => Boolean = _ % 2 == 0
even eq even
//Boolean = true
lazy val test: () => Int = {
val r = util.Random.nextInt
() => r
}
test()
// Int = -1068569869
test()
// Int = -1068569869 - same result
Performans
val
tanımlanmış bir zaman değerlendirir.
def
Her çağrıda değerlendirir, performans kötü sonra birden çok arama val
ile olabilir. Tek bir çağrı ile aynı performansı elde edersiniz. Ve hayır çağrıları ile bazı dallarda eğer kullanacaksanız bile tanımlayabilirsiniz def
, hiçbir yükü alırsınız.
Bir lazy val
bir tembel değerlendirme: tanımlayabilirsiniz bile olmaz ama bazı şubeleri ve değerlendirir bir ya da asla, ama biraz üstten çift kontrol kilitleme her erişim için lazy val
.
@SargeBorsch yöntemi tanımlayabilirsiniz belirtildiği gibi, ve bu en hızlı seçenektir:
def even(i: Int): Boolean = i % 2 == 0
Ama eğer ihtiyacın bir fonksiyonu (metodu) fonksiyonu kompozisyon ya da daha yüksek mertebeden fonksiyonlar (gibi filter(even)
) derleyici oluşturur bir işlevi gelen her yöntemi kullanarak bu işlevi, yani performans tarafından biraz daha kötü val
.
Arasındaki fark "ekran" ve &...
'devre dışı=&; devre dışı" " ...
&Quot arasındaki fark nedir;kelime-bre...
&Quot arasındaki fark nedir CSS;."...
Arasındaki fark nedir "Sınıf.() f...