2012-08-17 10 views
5

Quiero hacer muchas declaraciones de casos con el mismo guardia frente a cada uno. ¿Puedo hacerlo de forma que no requiera duplicación de código?Scala pattern match guardias predeterminadas

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

¿Puede dividir el código en ramas? así que saca "if variable" y haz la coincidencia dentro, ¿lo mismo para cualquier otra rama que tengas? – aishwarya

Respuesta

8

Se puede crear un extractor:

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

Parece que el (tubo) del operador o tiene mayor precedencia que el guardia, por lo que las siguientes obras:

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 respuesta es bueno De forma alternativa, puede hacer coincidir la "variable" primero:

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