2012-11-25 19 views
10

bir sınıfta alanlar ve parametreler arasında gerçek fark nedir:Scala: Bu iki sınıf arasındaki fark nedir yapıcısı

class Person { 
    var name : String = _ 
    var surname: String = _ 
} 

class Person (var name:String, var surname: String) 

adı soyadı her zaman Sınıf in Person alanlar. Eşit? Sadece sınıf kişiliğini oluşturma şeklini değiştiriyorum. Bu doğru mu?

cevap

6

Bir sınıfa her iki sürümünü derledik:

public experimental.PersonV0(); 
    Code: 
    0: aload_0 
    1: invokespecial #23; //Method java/lang/Object."<init>":()V 
    4: return 
} 

public experimental.PersonV1(java.lang.String, java.lang.String); 
    Code: 
    0: aload_0 
    1: aload_1 
    2: putfield #12; //Field name:Ljava/lang/String; 
    5: aload_0 
    6: aload_2 
    7: putfield #16; //Field surname:Ljava/lang/String; 
    10: aload_0 
    11: invokespecial #24; //Method java/lang/Object."<init>":()V 
    14: return 
} 
:

class PersonV0 { 
    var name : String = _ 
    var surname: String = _ 
} 

class PersonV1 (var name:String, var surname: String) 

fark kurucular olduğunu

10

İki arasındaki fark, ikinci durumda, alanların da yapıcı için parametrelerdir. Parametreleri val veya var olarak bildirirseniz, otomatik olarak herkese açık üyeler olur. Orada var/val var ve değişkenler herhangi bir yerde kullanmayın ama yapıcı, üye olmazlar, eğer, onlar, özel üyeler olacak. Bunları case class es yapacak olursanız, ilk durumda değişkenler için herhangi bir cevap alamazsınız.

Sorunuzu cevaplamak için: Bu durumda haklısınız, sadece değerleri ayarladığınız şekli değiştirirsiniz.

düzenleme:

İpucu: -print ile derleyici çağrı olmadığını görebilirsiniz, scala derleyici oluşturur, ne, bu da repl için çalışır.

İlgili konular