Drools MVEL方言 - 半结肠要求

时间:2017-09-25 11:15:27

标签: drools mvel

我很好奇为什么我的Eclipse Drools编译器(6.5.0)在For循环中的语句末尾需要分号,如下所示:

Map businessRulesRequest = $root.containsKey("BusinessRulesRequest") ? $root.get("BusinessRulesRequest") : null
Map quoteRequest = businessRulesRequest!=null && businessRulesRequest.containsKey("QuoteRequest") ? businessRulesRequest.get("QuoteRequest") : null
List resultsByKey = quoteRequest!=null && quoteRequest.containsKey("resultsByKey") ? quoteRequest.get("resultsByKey") : new ArrayList()

for (Map search : resultsByKey) {
    Map searchInfo = (search.containsKey("searchInfo") ? search.get("searchInfo") : null);
    String searchName = searchInfo!=null && searchInfo.containsKey("searchName") ? searchInfo.get("searchName").toString() : "";
    List results = (searchName=="quotesMotor" && search.containsKey("results") ? search.get("results") : new ArrayList());
}

如果我从For循环的第一行或第二行中删除分号,我会得到一个"意外的标记"错误,但如果我从循环的最后一行中删除它,则不会。

是否由于Drools将RHS行评估为单个语句,因此它们必须在任何循环内分开?

注意:我理解代码假设不需要使用分号不是最佳做法,但是我在尝试时遇到了这个问题,我只是想知道编译错误的原因。感谢。

1 个答案:

答案 0 :(得分:0)

我想答案是因为MVEL本身。 Drools可能会将整个代码块委托给MVEL进行评估和执行。

根据this guide,在MVEL中,如果您有1个语句,或者在脚本的最后一个语句中,则不需要使用分号。

希望它有所帮助,