由Eval或GroovyShell执行时的延迟GString求值
对于监控系统,我需要评估由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可能更复杂): 如果可能的话,我想在这里使用,这样如果webservice可用(第一个条件是由Eval或GroovyShell执行时的延迟GString求值,groovy,eval,lazy-evaluation,groovyshell,Groovy,Eval,Lazy Evaluation,Groovyshell,对于监控系统,我需要评估由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可能更复杂): 如果可能的话,我想在这里使用,这样如果webservice可用(第一个条件是false),第二部分就不会被计算,因为总体结果将是false。因此,我可以避免在不必要的时候连接邮件服务器(和其他耗时的操作) 以下是我试图实现的一个示例: class WebserviceDownCheck { boolean check() { println 'Checking webservi
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
nodowntimemailcheck().check()
不应执行,因为第一个条件已经是false
。
我试过:
- 使用
而不是GroovyShell
Eval
- 将
方法更改为字段并应用check()
转换@Lazy
- 将
更改为${new WebserviceDownCheck().check()}
(已查看)${->new WebserviceDownCheck().check()}
Eval
(或GroovyShell
)已经在执行时初始化GString
。对于GroovyShell
,可能有类似于惰性绑定的功能
我想知道,如果不编写自定义字符串求值逻辑,是否有可能将其组合成一个表达式,如下所示:
Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")
如果结果为假,则只对第一个进行求值。您是否尝试过新建WebserviceDownCheck().check()&新建NodeDownTimeEmailCheck().check()
,但没有将每个都包装到自己的求值块中?不知道为什么我没有考虑到这一点,非常感谢:)
Eval.me("${new WebserviceDownCheck().check() && new NoDowntimeEmailCheck().check()}")