由Eval或GroovyShell执行时的延迟GString求值

由Eval或GroovyShell执行时的延迟GString求值,groovy,eval,lazy-evaluation,groovyshell,Groovy,Eval,Lazy Evaluation,Groovyshell,对于监控系统,我需要评估由布尔表达式表示的自定义检查。例如,我有一个简单的伪代码条件(它们可能更复杂): 如果可能的话,我想在这里使用,这样如果webservice可用(第一个条件是false),第二部分就不会被计算,因为总体结果将是false。因此,我可以避免在不必要的时候连接邮件服务器(和其他耗时的操作) 以下是我试图实现的一个示例: class WebserviceDownCheck { boolean check() { println 'Checking webservi

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

如果可能的话,我想在这里使用,这样如果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
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()}")