在groovy中重新创建if/else:为一个函数提供多个闭包参数



当我试图在groovy中用闭包重新发明if/else语法时,我无法使其工作。我认为在括号外放置多个闭包是不允许的,但可能是其他原因。

如果不允许,您将如何重现If/else语法?这是一个思想实验,所以不要告诉我这个实现的低效性。

我的代码:

void ifx(boolean condition, Closure action){
  ["${true.toString()}": action].get(condition.toString(), {})()
}
void ifx(boolean condition, Closure action, Closure elsex){
  ["${true.toString()}": action, "${false.toString()}": elsex].get(condition.toString())()
}
void elsex(Closure action){
    action()
}
ifx(1==2){
    println("1")
} ifx(1==3){
    println("2")
} elsex{
    println("3")
}

错误消息:

java.lang.NullPointerException:无法对null调用方法ifx()目标

沿着以下几条线运行:

用闭包更新以避免全局状态:

def ifx( outerCondition, outerBlock ) {
  boolean matched = false
  def realIfx
  realIfx = { condition, block ->
    if (condition) {
      matched = true
      block()
    }
    [ifx: realIfx, elsex: { elseBlock -> if(!matched) elseBlock() }]
  }
  realIfx outerCondition, outerBlock
}

还有一些测试:

def result
ifx(1 == 2) {
  result = 1
} ifx(1 == 3) {
  result = 2
} elsex {
  result = 3
}
assert result == 3
result = null

ifx (1 == 2) {
  result = 1
} ifx (2 == 2) {
  result = 2
} elsex {
  result = 3
}
assert result == 2
result = null
ifx (true) {
  result = 1
} ifx (2 == 1) {
  result = 2
} elsex {
  result = 3
}
assert result == 1

ifx (1==2) {} ifx(1==3) {} elsex {}是一个转换为ifx(1==2,{}).ifx(1==3,{}).elsex({})的命令链表达式。由于void转换为null,因此应该清楚的是,第二个ifx调用会失败,并返回NPE。为了实现if/else类型的事情,我可能会做以下

void ifx(boolean condition, Closure ifBlock, Closure elseBlock) {
 ....
}
ifx (1==2) {...}{...}

意思是根本不使用else关键字。如果你想保持你的想法,你必须返回一些你可以称之为elsex和ifx的东西。。或者,如果不是ifx,则在第一个ifx-之后放入一个换行符

最新更新