2010-03-09 3 views
13

Fondamentalmente, vorrei poter creare un estrattore personalizzato senza doverlo memorizzare in una variabile prima di usarlo.Gli estrattori possono essere personalizzati con parametri nel corpo di un'istruzione case (o in qualsiasi altro punto in cui verrà utilizzato un estrattore)?

Questo non è un esempio reale di come lo utilizzerei, sarebbe più probabile che venga utilizzato nel caso di un'espressione regolare o di un altro modello di stringa simile, ma si spera che spieghi cosa sto cercando:

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} 

Quando solo facendo un unico estrattore personalizzato non fa molta differenza, ma se si stavano costruendo un ampio elenco di estrattori per una dichiarazione caso, potrebbe rendere le cose più difficili da leggere separando tutti i estrattori dal loro utilizzo.

Mi aspetto che la risposta è no, non si può fare questo, ma ho pensato di chiedere in giro prima: D

+0

E tu, um, * ci provavi *? –

+0

ho provato, ho ricevuto un errore di sintassi: scala> val {someExtractorBuilder (true)} (risultato) = "test" : 1: errore: inizio illegale di semplice schema val {someExtractorBuilder (true)} (risultato) = "test" ^ –

+0

Cosa stai cercando in definitiva di fare? Probabilmente c'è un modo migliore per farlo che creare molti estrattori. –

risposta

2

Nope.

8.1.7 Patterns 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

estrattori parametrizzazione sarebbe bello, ma non hanno le risorse per la loro attuazione in questo momento.

+1

Grazie per aver tenuto d'occhio questo tipo di domande :-) – Lutz

1

Si può personalizzare estrattori a certa misura utilizzando parametri impliciti, come questo:

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 
} 

Purtroppo questo non può essere utilizzato quando si desidera utilizzare diverse varianti in uno match, come tuttiLe dichiarazionisono nello stesso ambito. Tuttavia, a volte può essere utile.