Scala

2013-09-02 26 views
16

'da bir muhafazayı yeniden kullanmak Sıklıkla scala'daki bir güvenlik değerlendirmesinin sonucunu yeniden kullanmak istiyorum.Scala

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

Bu daha az bilinen bir ifade kullanarak mümkün mü? (üzerinde bir @ belirtmiyor)

Bu mümkün olan bir süre sonra mümkün olacak mı?

+0

+1 Bu oldukça sık karşılaşılan bir sorunun ilginç bir görünümüdür (daha zorlayıcı dillerdeki (res = pahalı) {/ * res * /} ile ilgili bir şeylere sahip olmak oldukça yaygındır ( –

cevap

18

Özel bir çıkarıcı kullanarak benzer bir şey yapabilirsiniz. Bu çalışması gerekir:

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

expensive gerçekten daha pahalı olduğundan emin olun yukarıda yaptığı iştir bir Option nesneyi yaratmak.

+0

) parlak bir çözüm, – fommil

+1

kafa karıştırıcı şey, "a" ve "e" nin, sezgisel sözdiziminden "yanlış yol" olduğu yönündedir. Bunu daha açık tutmak için "a" yi tanımlamamak en iyisidir. (yani 'a' orijinal değerdir, 'e' pahalı hesaplamanın sonucudur] – fommil