2010-03-09 11 views
13

Básicamente, me gustaría poder construir un extractor personalizado sin tener que almacenarlo en una variable antes de usarlo.¿Se pueden personalizar los extractores con parámetros en el cuerpo de una declaración de caso (o en cualquier otro lugar donde se use un extractor)?

Este no es un ejemplo real de cómo lo usaría, lo más probable es que se use en el caso de una expresión regular o algún otro patrón de cadena como construir, pero espero que explique lo que estoy buscando:

def someExtractorBuilder(arg:Boolean) = new { 
    def unapply(s:String):Option[String] = if(arg) Some(s) else None 
} 

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test" 
"test" match {case {someExtractorBuilder(true)}(result) => result } 

//instead I would have to do this: 
val customExtractor = someExtractorBuilder(true) 
val customExtractor(result) = "test" 
"test" match {case customExtractor(result) => result} 

Cuando acaba de hacer un solo extractor de costumbre, no tiene mucha diferencia, pero si alguien quisiera construir una gran lista de extractores para una declaración de caso, podría hacer las cosas más difíciles de leer por la separación de la totalidad de la extractores de su uso.

espero que la respuesta es no, no puedes hacer esto, pero pensé que le pediría alrededor primero: D

+0

¿Y usted, um, * try * it? –

+0

hice probarlo, he recibido un error de sintaxis: Scala> val {someExtractorBuilder (verdadero)} (resultado) = "prueba" : 1: Error: inicio ilegal de patrón simple val {someExtractorBuilder (verdadero)} (resultado) = "prueba" ^ –

+0

¿Qué estás tratando de hacer en última instancia? Probablemente haya una mejor manera de hacerlo que hacer muchos extractores. –

Respuesta

2

Nop.

8.1.7 Patrones Extractor

An extractor pattern x (p 1 , . . . , p n) where n ≥ 0 is of the same syntactic form as a constructor pattern. However, instead of a case class, the stable identifier x denotes an object which has a member method named unapply or unapplySeq that matches the pattern.

7

extractores de parametrización estaría bien, pero que no tienen los recursos para ponerlas en práctica en este momento.

+1

Gracias por vigilar este tipo de preguntas :-) – Lutz

1

Uno puede personalizar extractores en cierta medida utilizando parámetros implícitos, como este:

object SomeExtractorBuilder { 
    def unapply(s: String)(implicit arg: Boolean): Option[String] = if (arg) Some(s) else None 
} 

implicit val arg: Boolean = true 
"x" match { 
    case SomeExtractorBuilder(result) => 
    result 
} 

Desafortunadamente, esto no se puede utilizar cuando desea utilizar diferentes variantes en una match, como todas case declaraciones están en el mismo alcance. Aún así, puede ser útil a veces.

Cuestiones relacionadas