2010-11-06 14 views

Odpowiedz

2

Domyślam się, że szukasz match (lub po prostu if/else if/else).

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) 
} 

Pierwsze dwa opisy przypadków pokazują dopasowywanie wzorców oparte na typie. Trzecie pokazuje użycie Ekstraktora do podziału danych na części składowe i przypisania tych części do zmiennych. Trzeci pokazuje dopasowanie ze zmiennym wzorcem, które będzie pasować do wszystkiego. Nie pokazany jest przypadek _:

case _ => println("what") 

który podobnie jak zmiennej strukturze mecz, zapałki niczego, ale nie wiąże się dopasowanego obiektu do zmiennej.

Klasą przypadku na górze jest skrót Scala służący do tworzenia ekstraktora oraz samej klasy.

1

Oczywiście, ani match ani if nie robi dokładnie to samo, co cond. Jedną z możliwości jest zrobić tak:

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

Ten obiekt akceptuje coś iterowalny gdzie każdy element jest parą funkcję powracającego Boolean oraz funkcję powracającego Any. Próbuje znaleźć element, którego pierwsza funkcja zwraca wartość true, przestaje sprawdzać, czy znajduje, wywołuje drugą funkcję na znalezionym elemencie i zwraca wynik tej funkcji (lub(), jeśli żadna nie została znaleziona).

Przykłady:

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: Tak, wiem, że jest brzydki, ale to działa.