我正在尝试使用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”部分的方法。有谁能告诉我他们将如何实施它?
您通常通过返回中间对象来创建这些类型的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)
那是因为你没有一个也返回U的else
你可以返回一个Option [U]而在else中返回None