2010-11-06 23 views

cevap

2

Sanırım match (veya sadece if/else if/else numaralı telefonu) arıyoruz.

2
case class Paired(x: Int, y: Int) 

def foo(x: Any) = x match { 
    case string : String => println("Got a string") 
    case num : Int if num < 100 => println("Number less than 100") 
    case Paired(x,y) => println("Got x and y: " + x + ", " + y) 
    case unknown => println("??: " + unknown) 
} 

İlk iki durum ifadesi, türe göre desen eşleştirmesi gösterir. Üçüncüsü veriyi bileşen parçalara ayırmak ve bu parçaları değişkenlere atamak için bir Extractor'ın kullanımını göstermektedir. Üçüncüsü, her şeyle eşleşecek olan değişken bir desen eşleşmesini gösterir. Gösterilmedi _ durumdur: değişken desen maçı gibi, her şeye uyar ama bir değişkene eşleşti nesneyi bağlamak değil

case _ => println("what") 

.

Üst sınıfta, sınıfın kendisi kadar bir çıkarıcı oluşturmak için Scala kısaltması da bulunuyor.

1

Elbette, ne match ne de if, cond ile aynı şeyi yapmaz. Bir ihtimal böyle yapmaktır:

object Cond { 
    def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = { 
    clauses find (_._1()) map (_._2()) getOrElse() 
    } 
} 

Bu nesne, her öğe, Bool ve herhangi dönen bir işlev dönen bir fonksiyonun bir çift şey iterable kabul eder. İlk işlevi doğru olarak döndüren bir öğeyi bulmaya çalışır, bir tane bulup bulmayacağına bakmayı durdurur, ikinci bir işlevi bulunan bir öğe üzerinde çağırır ve bu işlevin sonucunu döndürür (veya(), hiçbiri bulunmazsa).

Örnekler:

val clauses = Seq(
    ({()=>false}, {()=>println("foo")}), 
    ({()=>true}, {()=>println("bar")}) 
) 
Cond(clauses) 

def checkYear(year: Int) = { 
    Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}), 
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}}) 
)) 
} 

ETA: Evet, öyle çirkin olduğunu biliyorum ama işe yarıyor.