В Scala Option
, к сожалению, отсутствует способ сделать именно это.Я добавляю один:
class OptionWrapper[A](o: Option[A]) {
def fold[Z](default: => Z)(action: A => Z) = o.map(action).getOrElse(default)
}
implicit def option_has_utility[A](o: Option[A]) = new OptionWrapper(o)
, который имеет немного более приятное (на мой взгляд) использование
op.fold{ println("Empty!") }{ x => doStuffWith(x) }
Вы можете видеть из того, как определено, что map
/ getOrElse
может бытьиспользуется вместо сопоставления с образцом.
В качестве альтернативы, Either
уже имеет метод fold
.Таким образом, вы можете
op.toRight(()).fold{ _ => println("Empty!") }{ x => doStuffWith(x) }
, но это немного неуклюже, учитывая, что вы должны предоставить левое значение (здесь ()
, то есть Unit) и затем определить функцию для этого, а не просто указать, что выхочу, чтобы это произошло на None
.
Сравнение с образцом также неплохо, особенно для более длинных блоков кода.Для коротких накладные расходы в матче начинают мешать очкам.Например:
op.fold{ printError }{ saveUserInput }
имеет намного меньше синтаксических издержек, чем
op match {
case Some(x) => saveUserInput(x)
case None => printError
}
, и поэтому, как только вы ожидаете, это намного легче понять.