2017-09-25 23 views
0

我只是好奇,为什么我的Eclipse Drools的编译器(6.5.0)需要分号在语句对于循环的结束,如下图所示:Drools的MVEL方言 - 分号需求

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行评估为单个语句,因此它们必须在任何循环内分开?

注:我明白这是不是最好的做法,假设不需要分号码,但是我在试验时遇到了这个问题,并且只是想知道编译器错误的原因。谢谢。

回答

0

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

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

希望它能帮助,

+0

谢谢,是的,它看起来像它把“如果”,“对”等内容作为单行线,所以如果分号不添加到行结束它的处理作为一个单一的声明。最好在我认为所有生产线上添加分号,以确保安全。 – Neil