2011-05-27 13 views
18

Desen, çoklu argüman listeleriyle bir sınıf nasıl eşleştirilir?

class DateTime(year: Int, month: Int, day: Int)(hour: Int, minute: Int, second: Int) 

ben gibi bir şey karşı maç isterseniz unapply yöntemi gibi nasıl görüneceğini:

dt match { 
    case DateTime(2012, 12, 12)(12, _, _) => // December 12th 2012, 12 o'clock 
    /* ... */ 
} 

bu çalıştı:

def unapply(dt: DateTime) = 
    Some((dt.year, dt.month, dt.day),(dt.hour, dt.minute, dt.second)) 

Ama bu

bu sınıfı düşünün Gerçekten çalışmadı.

cevap

21

Vaka sınıfları maçı sadece parametrelerin ilk sette (ve onların diğer şık şeyler): Bu yüzden

scala> case class A(i: Int)(j: Int) { } 
defined class A 

scala> A(5)(4) match { case A(5) => "Hi" } 
res14: java.lang.String = Hi 

scala> A(5)(4) == A(5)(9) 
res15: Boolean = true 

bir durum sınıfı değilse, sen uygulamasını kaldırma istediğiniz bir şey olması tanımlayabilirsiniz gerçekten sınıfın uygulayıcısı kadar. Varsayılan olarak, hiç bir rahatsızlık yoktur, bu nedenle yalnızca türle eşleşebilirsiniz.

Eğer bölünme çeşit uyacak ve her konuda eşitliğini, ama var edememek dahil şık vaka sınıf özelliklerini kullanmak istiyorsanız

, yapabilirsin yuva vaka sınıfları:

case class Time(hour: Int, minute: Int, second: Int) { } 
case class Date(year: Int, month: Int, day: Int) { } 
case class DateTime(date: Date, time: Time) { } 

scala> val dt = DateTime(Date(2011,5,27), Time(15,21,50)) 
scala> dt match { case DateTime(Date(2011,_,_),Time(h,m,50)) => println(h + ":" + m) } 
15:21 
1

Muhtemelen vermedi Scala'nın hiçbir virgül operatörüne sahip olmaması ve işten çıkarıcıdan Some((a,b),(x,y))'u iade etmeniz nedeniyle çalışmanız. (yerine Some(((a,b,c),(x,y,z))) kullandıysanız yani Tuple2[Tuple3[A,B,C],Tuple3[X,Y,Z]] Muhtemelen işe yarayacağını düşünüyorum. Sadece Rex'in cevap üzerine inşa etmek

9

, sadece can yalnızca desen ilk parametre bloğunda maç, ancak bu davranış tasarım gereğidir çok fazla.

vaka sınıfları, cebirsel veri türleri olarak, hatta birden fazla parametre listelerini destekliyoruz

daha ilginç bir soru

Orada durum sınıfları için özel davranış eklemek için hiçbir yeterince güçlü bir gerekçe var ve birden çok parametre listeleri haline gelmek ... olduğu Oldukça yararlı: Üretim kodunda bu tesis genellikle sadece doğal olarak istemeyeceğiniz örtülü argümanlar sağlamak için kullanılır. o desen eşleşmesi.

+3

Birden çok parametre listesi olabileceğinden, birden çok parametre listesi güzeldir. –

+0

Belki bu biraz tartışmalı bir örnektir, ancak eğer 'Case class MyCase [A <: WithBar] (a: A) (b: A # Bar) 'diyebilseydiniz ve tüm" şık özellikleri "kutusundan çıkarırsanız 'a' için tip açıklama olmaksızın val x = MyCase (FooWithBar (...)) (Bar (...)) 'gibi yeni örnekler oluşturmak mümkün olabilir. 'MyCase [A <: WithBar] (a: A, b: A # Bar)' gibi bir imza ile 'val x = MyCase [FooWithBar] (FooWithBar (...), Bar (..) ile eşleştirmeniz gerekir. .)), çünkü tür çıkarımı, "A" türünde parametre olarak aynı parametre listesinde belirtildiğinde "A # Bar" için çalışmaz. – falconepl

+0

Örnek sınıf günlüğünden kaçınmanın bir başka nedeni. Dilin birçok gelişmiş özelliği (veya konsepti) ile iyi oynamazlar. – matanster