2013-09-02 16 views
16

Spesso mi ritrovo a voler riutilizzare il risultato di una valutazione di guardia in scala, ad es.riutilizzare una guardia in Scala

blah match { 
    case Blah(a, b) if expensive(a) < 10 => 
    expensive(a) 
    case _ => b 
} 

È possibile utilizzare un incantesimo meno noto? (il numero expensive non funziona)

Questo sarà possibile in qualsiasi momento presto?

+0

+1 perché questo è un aspetto interessante di un problema abbastanza comune (è abbastanza comune avere cose come 'if (res = expensive) {/ * qualcosa con res * /}' in lingue più imperative. –

risposta

18

È possibile eseguire un'operazione simile utilizzando un estrattore personalizzato. Questo dovrebbe funzionare:

case class Blah(a: Int, b: Int) 

object expensive { 
    def unapply(x: Int): Option[Double] = Some(math.cos(x)) 
} 

Blah(1, 1) match { 
    case Blah(a @ expensive(e), b) if e < 10 => println(a, b, e) 
    case _ => println("nothing") 
} 

essere sicuri che il expensive è davvero più costoso che la creazione di un oggetto Option, che è ciò di cui sopra fa.

+0

che è in realtà un soluzione brillante, grazie! – fommil

+1

la cosa confusa è che 'a' e' e' sono "in senso inverso" dalla sintassi intuitiva. È meglio non definire il 'a' affatto per mantenerlo più chiaro. (cioè 'a' è il valore originale,' e' è il risultato di fare il calcolo costoso) – fommil

Problemi correlati