2012-08-17 21 views
5

Chcę zrobić wiele spraw z takimi samymi strażnikami przed każdym z nich. Czy mogę to zrobić w sposób, który nie wymaga powielania kodu?Scala pattern match default guard

"something" match { 
    case "a" if(variable) => println("a") 
    case "b" if(variable) => println("b") 
    // ... 
} 
+1

czy możesz podzielić kod na gałęzie? więc wyciągnij "jeśli zmienna" i wykonaj mecz w środku, to samo dla innych gałęzi, które masz? – aishwarya

Odpowiedz

8

Można by utworzyć ściągacza:

class If { 
    def unapply(s: Any) = if (variable) Some(s) else None 
} 
object If extends If 
"something" match { 
    case If("a") => println("a") 
    case If("b") => println("b") 
    // ... 
} 
7

Wydaje się, że (rura) Operator OR ma wyższy priorytet niż warty, więc następujące prace:

odpowiedź
def test(s: String, v: Boolean) = s match { 
    case "a" | "b" if v => true 
    case _ => false 
} 

assert(!test("a", false)) 
assert(test("a", true)) 
assert(!test("b", false)) 
assert(test("b", true)) 
4

0 __ 's jest dobry. Alternatywnie możesz najpierw dopasować do "zmiennej":

variable match { 
    case true => s match { 
    case "a" | "b" | "c" => true 
    case _ => false 
    } 
    case _ => false 
}