在 groovy 中重新创建 if/else:为函数提供多个闭包参数
Recreating the if/else in groovy: giving multiple closures arguments to a function
在尝试用 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: Cannot invoke method ifx() on null
object
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 关键字。如果你想保留你的想法,你必须 return 一些你可以调用 elsex 和 ifx 的东西。或者如果不是 ifx,那么在第一个 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
在尝试用 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: Cannot invoke method ifx() on null object
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 关键字。如果你想保留你的想法,你必须 return 一些你可以调用 elsex 和 ifx 的东西。或者如果不是 ifx,那么在第一个 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