2013-09-02 5 views
16

Я часто обнаруживаю, что хочу повторно использовать результат оценки защиты в scala, например.Повторное использование охранника в Scala

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

Возможно ли это, используя какое-то менее известное заклинание? (помещение @ на expensive не работает)

Возможно ли это в ближайшее время?

+0

+1, потому что это интересный вид довольно распространенной проблемы (довольно часто встречаются такие вещи, как 'if (res = cost) {/ * something with res * /}' на более настоятельных языках. –

ответ

18

Вы можете сделать что-то подобное с помощью пользовательского экстрактора. Это должно работать:

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 действительно дороже, что создание Option объекта, который является то, что выше делает.

+0

это на самом деле блестящее обходное решение, спасибо! – fommil

+1

Заблуждение состоит в том, что 'a' и' e' являются «неправильным способом» из интуитивного синтаксиса. Лучше всего не определять 'a' вообще, чтобы он был более ясным. (т.е. 'a' является исходным значением,' e' является результатом дорогого расчета) – fommil

Смежные вопросы