2011-06-26 14 views
25

puede escribir:¿Cómo funciona | (tubería) en el trabajo de coincidencia de patrones?

str match { case "foo" | "bar" => ... } 

A primera vista parece que | podría ser un objeto extractora, sin embargo:

str match { case |("foo", "bar") => ... } 

no funciona. (Y no veo cómo se podría implementar de todos modos.)

¿Es un operador mágico incorporado?

(creo que he visto en esta pregunta por lo que antes, pero es imposible buscar ...)

+1

Aquí hay un [ejemplo] (http://stackoverflow.com/questions/6384073/catching-multiple-exceptions-at-once-in-scala/6385333#6385333). – agilesteel

Respuesta

24

Sí, la tubería (|) está incorporada para la coincidencia de patrones (consulte the scala language reference). La sección de coincidencia de patrones (sección 8) define en la sección 8.1.11 lo que se llama Alternativas de patrón. La definición dice:

Un patrón alternativo p1 | ... | pn consiste en una serie de patrones alternativos pi. Todos los patrones alternativos se comprueban con el tipo esperado del patrón. No pueden vincular variables que no sean comodines. El patrón alternativo coincide con un valor v si al menos uno de sus alternativas coincide v.

Así que sí, el tubo es un incorporado que es sensible al contexto a la coincidencia de patrones.

35

| no está implementado en la biblioteca, que es interpretado por el compilador de Scala. Se construye un nuevo patrón que se define como la disyunción entre dos sub-patrones que no se unen cualquier variable (aunque el patrón recién formado puede estar unido en sí, es decir, se puede escribir cosas como

try { /*...*/ } 
catch { 
    case e @ (_: IOException | _: IllegalArgumentException) => /*...*/ 
} 

y e obtiene como escriba el supertipo más específico de las alternativas enumeradas).

Cuestiones relacionadas