Повторите использование защитного устройства в Scala

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

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

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

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

Ответы

Ответ 1

Вы можете сделать что-то подобное, используя специальный экстрактор. Это должно работать:

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, что и было сделано выше.