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

问题描述 投票:0回答:2

我正在尝试使用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”部分的方法。有谁能告诉我他们将如何实施它?

scala
2个回答
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
投票

那是因为你没有一个也返回U的else你可以返回一个Option [U]而在else中返回None

© www.soinside.com 2019 - 2024. All rights reserved.