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
E tu, um, * ci provavi *? –
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" ^ –
Cosa stai cercando in definitiva di fare? Probabilmente c'è un modo migliore per farlo che creare molti estrattori. –