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