gpt4 book ai didi

groovy - 由 Eval 或 GroovyShell 执行时的惰性 GString 评估

转载 作者:行者123 更新时间:2023-12-04 08:03:52 25 4
gpt4 key购买 nike

对于监控系统,我需要评估由 bool 表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可以更复杂):

if (webservice is unavailable) and (there are no emails about planned downtime)

如果可能,我想使用 short-circuit evaluation在这里,如果 webservice 可用(并且第一个条件为 false),则不会评估第二部分,因为总的结果无论如何都是 false。因此,我可以避免在不必要时连接到邮件服务器(以及其他耗时的操作)。

这是我要实现的目标的示例:

class WebserviceDownCheck {
boolean check() {
println 'Checking webservice'
return false
}
}

class NoDowntimeEmailCheck {
boolean check() { //shouldn't be executed
println 'Checking emails'
return true
}
}
//using string evaluation, because conditions are constructed during runtime
Eval.me("${new WebserviceDownCheck().check()} && ${new NoDowntimeEmailCheck().check()}")

输出是:

Checking webservice
Checking emails //shouldn't be there
Result: false

NoDowntimeEmailCheck().check() 不应执行,因为第一个条件已经是 false。我试过:

  • 使用 GroovyShell 而不是 Eval
  • check() 方法更改为字段并应用 @Lazy 转换
  • ${new WebserviceDownCheck().check()} 更改为 ${ -> new WebserviceDownCheck().check()}(看到了 here)

似乎我需要一些惰性机制,它允许我在 Eval(或 GroovyShell)已经在执行它时初始化 GString。可能类似于 GroovyShell 的惰性 Binding

我想知道,是否可以不编写自定义字符串评估逻辑以某种方式实现?

最佳答案

把它组合成一个表达式,像这样:

Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")

如果结果为假,则只评估第一个。

关于groovy - 由 Eval 或 GroovyShell 执行时的惰性 GString 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com