SORU
19 EYLÜL 2013, PERŞEMBE


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
19 EYLÜL 2013, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EEVblog2

    EEVblog2

    2 HAZİRAN 2014
  • FrameCityJackal

    FrameCityJac

    4 Aralık 2010
  • wwjoshdew

    wwjoshdew

    1 AĞUSTOS 2007