2013-09-02 12 views
16

Często chciałbym ponownie wykorzystać wynik oceny strażnika w scala, np.ponownie użyć strażnika w Scali

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

Czy jest to możliwe przy użyciu mniej znanych zaklęć? (wstawienie @ na urządzeniu expensive nie działa)

Czy będzie to możliwe w najbliższym czasie?

+0

+1, ponieważ jest to interesujący występ dość powszechnego problemu (dość powszechne jest to, że w bardziej imperatywnych językach są takie rzeczy jak 'if (res = expensive) {/ * something with res * /}' –

Odpowiedz

18

Możesz zrobić coś podobnego za pomocą niestandardowego ekstraktora. To powinno działać:

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") 
} 

Pamiętaj, że expensive jest naprawdę droższe że stworzenie Option Obiekt, który jest co wyżej robi.

+0

. genialne obejście, dzięki! – fommil

+1

mylące jest to, że "a" i "e" są "w niewłaściwy sposób" z intuicyjnej składni.Nie jest najlepiej, aby zdefiniować 'a' w ogóle, aby zachować jaśniejszy. (tzn. 'a' jest wartością pierwotną,' e' jest wynikiem wykonania kosztownych obliczeń) – fommil

Powiązane problemy