generic for scala extractor unapply

scala - for - ¿Pueden los extractores personalizarse con parámetros en el cuerpo de una declaración de caso(o en cualquier otro lugar donde se use un extractor)?



scala for (4)

Nop.

8.1.7 Patrones de extracción

Un patrón de extractor x (p 1, ..., pn) donde n ≥ 0 tiene la misma forma sintáctica que un patrón de constructor. Sin embargo, en lugar de una clase de caso, el identificador estable x denota un objeto que tiene un método miembro llamado unapply o unapplySeq que coincide con el patrón.

Básicamente, me gustaría poder construir un extractor personalizado sin tener que almacenarlo en una variable antes de usarlo.

Este no es un ejemplo real de cómo lo usaría, sería más probable que se utilizara 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 se hace un único extractor personalizado, no hace mucha diferencia, pero si se está construyendo una gran lista de extractores para una declaración de caso, podría hacer que las cosas sean más difíciles de leer al separar todos los extractores de su uso.

Espero que la respuesta sea no, no puedes hacer esto, pero pensé en preguntar primero: D


Parameterising extractores sería genial, pero no tenemos los recursos para implementarlos en este momento.



Uno puede personalizar los extractores hasta cierto punto usando 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 usar cuando desea usar diferentes variantes en una match , ya que todas las declaraciones de case están en el mismo ámbito. Aún así, puede ser útil a veces.