2011-03-26 21 views

Respuesta

27

Necesita una forma genérica para manejar "ignorar". Las opciones, entre otras clases, proporcionan esto (entre otras cosas). Para que pueda:

val i = 7 
Some(i) collect { 
    case 3 => "Yay!" 
    case 5 => "Boo!" 
} 

para obtener None (escrito como un Option[String]). Básicamente, si cambia x match a Some(x) collect, obtendrá la funcionalidad que desea. Es mejor hacer esto cuando uno se siente cómodo con las opciones de manejo.

2

Cualquier bloque de coincidencia que no pueda manejar todos los posibles valores de entrada forma una Función Parcial, que es absolutamente posible de definir y usar en Scala.

PartialFunction es una subclase de Function, y agrega el método isDefinedAt, que devuelve verdadero si tiene una coincidencia definida para el valor proporcionado. Las funciones parciales se utilizan mejor en lugares que prueban la definición, como catch blocks o el método collect en la API de 2,8 colecciones. De lo contrario, obtendrá una excepción si intenta llamarlo con un valor que no está definido como una entrada.

+0

Más allá de la excepción, creo que también recibirás una advertencia en el sitio de definición, ¿no es cierto? – Blaisorblade

11

Escribe un matcher genérica:

object Match { 
    def default: PartialFunction[Any, Unit] = { case _ => } 
    def apply[T](x: T)(body: PartialFunction[T, Unit]) = (body orElse default)(x) 
} 

Ejemplo:

scala> 1 to 5 foreach (Match(_) { 
    | case 2 => println("two") 
    | case 3 => println("three") 
    | } 
    |) 
two 
three 

Usted también puede estar interesado en los métodos PartialFunction 's compañero de objetos cond y condOpt.

+0

Gracias por la respuesta. Entonces, ¿no existe una función de tipo 'reunir' equivalente para 'foreach'? –

+0

@MatthewSaltz No hay. –

Cuestiones relacionadas