Конечно, ни match
, ни if
не делают в точности то же самое, что и cond
.Одна возможность состоит в следующем:
object Cond {
def apply(clauses: Iterable[(()=>Boolean, ()=>Any)]): Any = {
clauses find (_._1()) map (_._2()) getOrElse ()
}
}
Этот объект принимает что-то итерируемое, где каждый элемент представляет собой пару функций, возвращающих логическое значение, и функции, возвращающей любое значение.Он пытается найти элемент, первая функция которого возвращает true, прекращает поиск, если найдет его, вызывает вторую функцию для найденного элемента и возвращает результат этой функции (или (), если ни одна не была найдена).
Примеры:
val clauses = Seq(
({()=>false}, {()=>println("foo")}),
({()=>true}, {()=>println("bar")})
)
Cond(clauses)
def checkYear(year: Int) = {
Cond(Seq(
({()=>year % 400 == 0}, {()=>42}),
({()=>true}, {()=>{c:Char => (c.toString * 3)}})
))
}
ETA: Да, я знаю, что это некрасиво, но это работает.