2011-07-03 17 views
7

Scala'da yeniyim ve Swing'i Scala'da çalışırken örneklerden birini takip ediyorum ve bir soru soruyorum. ,Scala Salıncak Etkinliğinde Kullanılan Backquote

listenTo(celsius, fahrenheit) 
    reactions += { 
     case EditDone(`fahrenheit`) => 
     val f = Integer.parseInt(fahrenheit.text) 
     celsius.text = ((f - 32) * 5/9).toString 

     case EditDone(`celsius`) => 
     val c = Integer.parseInt(celsius.text) 
     fahrenheit.text = ((c * 9)/5 + 32).toString 
    } 

dayanarak neden mesela benim textfield bileşenlerini tanımlamak için EditDone (`fahrenheit`) ve EditDone (` celsius`) içinde backquote (`) kullanmak zorunda yapmak fahrenheit ve celsius? Neden bunun yerine EditDone(fahrenheit)'u kullanamıyorum?

Teşekkür

cevap

15

Bu, desen eşleştirmesi ile ilgili. Desen maç içinde küçük harfle isim kullanıyorsanız:

reactions += { 
    case EditDone(fahrenheit) => // ... 
} 

sonra nesne (bu durumda olay) eşleştirilerek herhangi Widget'teki herhangi EditDone olay karşı eşleştirilecek. Widget referansını fahrenheit ismine bağlar. Bu durumda fahrenheit yeni bir değer haline gelir. Eğer komutu ters tırnak kullanırsanız

Ancak: EditDone olay daha önce tanımlanan değerin fahrenheit tarafından başvurulan mevcut nesne, işaret ederse

val fahrenheit = new TextField 
... 
reactions += { 
    case EditDone(`fahrenheit`) => // ... 
} 

sonra desen maçı sadece başarılı olacaktır.

fahrenheit değerinin adı Fahrenheit gibi büyükse, o zaman backtick'leri kullanmanız gerekmeyeceğini unutmayın. Bu, karşısında eşleştirmek istediğiniz sabitler veya nesneler varsa yararlıdır - bunlar genellikle büyük harflere sahiptir.

8
case EditDone(`fahrenheit`) 

EditDone bir değer ayıklar ve mevcut yerel değişkene fahrenheit karşılaştırır,

case EditDone(fahrenheit) 

EditDone arasında bir değer ayıklar ederken, bu suretle gölgelendirme yeni bir yerel değişken fahrenheit (yaratır mevcut olanı) ve çıkarılan değeri yeni değişkene atar.

İlgili konular