如何使用对象在Scala中重新创建if else语句?

时间:2019-04-16 08:28:59

标签: scala

我正在尝试使用thunk代码在Scala中实现自己的if-else一样的控制结构。关键是要创建一个具有与if-else语句相同的行为但具有自定义名称的控件结构。事实是,我无法弄清楚如何实现if else语句的完整情况,我被困在执行if的过程中。

object Si {
      def apply[U](expression:Boolean)(instruction:U):U = {
        if (expression) instruction
      }

    }

这段代码无法编译。它说值Any不符合预期的类型U。我知道问题是什么,但我不知道实现“ else”部分的方式。 谁能告诉我他们将如何实施?

2 个答案:

答案 0 :(得分:3)

通常,您通过返回中间对象直到整个表达式完成来创建此类DSL。

object fi { 
  def apply[R](cond: Boolean)(then: => R): IfThen[R] = new IfThen(cond, then)

  class IfThen[R](cond: Boolean, then: => R) {
    def esle[S >: R](ethen: => S) = if (cond) then else ethen 
  }
}

然后,您几乎可以像普通的if ... else ...一样使用它。始终只需要else部分。

scala> fi (1 > 2 - 3) { Some("foo") } esle { None }
res9: Option[String] = Some(foo)

答案 1 :(得分:1)

那是因为您没有else也会返回U 您可以改为返回Option [U],并在else中返回None