在Scala中对布尔返回值应用orElse

时间:2014-10-09 10:36:00

标签: scala functional-programming conditional-statements

有一个方法def invoke(...): Boolean我希望我能用这样的orElse链接一些错误处理:

invoke(...) orElse (throw InvokeError(...))

如果orElse的返回值为invoke(...),则执行false部分。现在我了解到orElse不是Boolean的方法。

  • orElse类型上设置Boolean是否有意义?
  • 是否有规范的systax来实现相同的语义(if (!invoke(...)) throw InvokeError(...)除外)

2 个答案:

答案 0 :(得分:3)

如何

invoke(...) || (throw InvokeError(...))

||是逻辑or,它是短路的,这意味着只有当第一个参数为假时,它的第二个参数才会被懒惰地评估。

话虽如此,它可能更适合您的invoke方法返回更具语义意义的内容,例如OptionTry

答案 1 :(得分:1)

你可以使用orElse和一点点伏都教:

class RichBoolean(b: Boolean) {
  def orElse(f: (Boolean) => Unit) = f(b)
}

object RichBoolean {
  implicit def enrich(b: Boolean) = new RichBoolean(b)
}

现在您可以通过以下方式使用它:

import RichBoolean._

val throwInvokeError = (b: Boolean) => if (!b) throw InvokeError(...)

invoke(...).orElse(throwInvokeError)