SORU
28 Aralık 2010, Salı


' => arasındaki fark ne; , ()=> ve Birim=>

Tartışma yok ve hiçbir değeri döndürür (eğer bilmen gerekiyorsa, JavaScript setTimeout fonksiyonu, taklit ediyorum.) götüren bir işlevi temsil etmeye çalışıyorum

case class Scheduled(time : Int, callback :  => Unit)

diyerek derleme değildir " `' parametreleri arama adı olmayabilir" . val

case class Scheduled(time : Int, callback :  () => Unit)  

derler, ama çağrılacak olan garip, yerine

Scheduled(40, { println("x") } )

Bunu yapmak zorundayım

Scheduled(40, { () => println("x") } )      

Ayrıca çalışır

class Scheduled(time : Int, callback :  Unit => Unit)

ama daha-az-mantıklı bir şekilde çağrılır

 Scheduled(40, { x : Unit => println("x") } )

(Ne olur yazın Birimi?) bir değişken Ne Benistiyorumtabii ki, eğer sıradan bir fonksiyon olsaydı onu çağırmak benim yapacağım çağır bir yapıcı:

 Scheduled(40, println("x") )

Bebek biberonunu ver!

CEVAP
28 Aralık 2010, Salı


-İsmini: =>Yazın

many ways parametrelerden biri olan call-by-name, => Type gösterim standları geçirilebilir. Eğer onlara aşina değil ise bile, günümüzde çoğunlukla olsa da, bu wikipedia makale okumak için biraz zaman ayırdığınız tarafından değer arama ve referans olarak arama yapmanızı öneririm.

Ne demek geçirildiyerinedeğer adı için işlev içinde. Örneğin, bu fonksiyon:

def f(x: => Int) = x * x

Eğer ararsam bu böyle

var y = 0
f { y  = 1; y }

Sonra kodu bu şekilde yürütülür

{ y  = 1; y } * { y  = 1; y }

O olursa ne olur bu konuya değiniyor olsa da tanımlayıcı adı bir çatışma var. Call-by-name, bir mekanizma yakalama kaçınarak adlı geleneksel olarak yer değiştirme adı çatışmaları önlemek için alır. Scala, ancak, bu parametre içinde -- tanımlayıcı isim başvurabilir mi aynı sonucu başka bir şekilde uygulanan veya çağrılan işlev gölge tanımlayıcıları.

Diğer bazı noktaları diğer iki açıkladıktan sonra anlatacağım o aramadan adı ile ilgili.

0-parametre Fonksiyonlar: () =>Yazın

Sözdizimi () => Type Function0 bir türü için duruyor. O, hiçbir parametre alan bir fonksiyon bir şey. Bu eşdeğer, ki size() -- hayır parametreleri alır ve bu yöntem bir numara arıyor.

Bu bir sözdizimi sözdizimi çok benzer ilginç, ancak,anonim fonksiyon değişmezbazı karışıklığa neden olan., Örneğin,

() => println("I'm an anonymous function")

anonim bir fonksiyonu parametre değişmez 0, olanyazın

() => Unit

Yazabiliriz:

val f: () => Unit = () => println("I'm an anonymous function")

Ancak çok önemli.

Birim =>Yazın

Bu aslında sadece 35 ** türü olan Function1, bir. Bunu yazmak için başka yollar (Unit) => Type Function1[Unit, Type] olurdu. Şey... bu insanın ne istediğini hiç olması pek mümkün değildir. Unit türün temel amacı bir ilgi olmadığını gösteren bir değeri vardır, bu yüzden mantıklı gelmiyoralırsınızbu değer.

Örneğin, düşünün

def f(x: Unit) = ...

Bir olasılıkla x ile ne yapabilirim? Sadece bir tane almak zorunda kalmazsınız tek bir değere sahip olabilir. Bir olası fonksiyonları Unit dönen zincirleme olurdu:

val f = (x: Unit) => println("I'm f")
val g = (x: Unit) => println("I'm g")
val h = f andThen g

Çünkü andThen sadece tanımlı Function1 ve işlevleri zincirleme geri dönüyor Unit vardı, biz tanımlamak için bunları gibi tipi Function1[Unit, Unit] edebilmek için zincir.

Karışıklık kaynakları

İlk karışıklığı kaynağı 0-parametre fonksiyonlar da call-by-adı için var olduğunu yazın ve yazınsal arasındaki benzerlik düşünüyor. Diğer bir deyişle, çünkü düşünme

() => { println("Hi!") }

() => Unit için değişmez

{ println("Hi!") }

=> Unit bir edebi olur. Değil. Birkod bloğubir edebi değil.

Karışıklık başka bir kaynak Unit yazındeğer0-parametre gibi görünüyor (), yazılır listesi parametre (ama değil).

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bratayley

    Bratayley

    30 Aralık 2010
  • foreignimage

    foreignimage

    13 HAZİRAN 2006
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007