![Drools规则引擎技术指南](https://wfqqreader-1252317822.image.myqcloud.com/cover/566/26833566/b_26833566.jpg)
上QQ阅读APP看书,第一时间看更新
3.4 运算符
运算符是在程序中最常用的计算方法,一般的运算符包括“+”“-”“*”“/”“%”等,优先级与Java相同。下面通过“/”运算举例说明。
编辑hello.drl,添加test006规则,其内容为:
rule "test006" when $p:Person(age/2==20); then System.out.println("规则test006规则执行成功"+$p); end
执行调用规则代码,运行结果如图3-1所示。
![040-1](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/040-1.jpg?sign=1739336945-z6pri7R3ayRNxzyYKTKHxnFqaxUgACB7-0-9b771ae406c2acd62ba1a4e8c1a80c7c)
图3-1 操作除号取除结果
% 取模的操作是常用的运算方法,编辑hello.drl,添加test007规则,其内容为:
rule "test007" when $p:Person(age%2==0); then System.out.println("规则test007规则执行成功"+$p); end
执行调用规则代码,运行结果如图3-2所示。
![040-2](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/040-2.jpg?sign=1739336945-e9Zoj7ZRNnqZPqanGVpBn87lR3HRuEql-0-f150020f965aff81727dcb9f5ee47f6a)
图3-2 取模操作异常结果
为了验证测用例的语法是否正确,查阅官方文档后,找到取模运算符的操作,证明是可以使用的,如图3-3所示。
![041-1](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/041-1.jpg?sign=1739336945-vlxWtkpmTEKPjUXxyc0y5CDB4s14NPoI-0-350ae09faa1929b0dd4f1f3b8abaa7d8)
图3-3 官方取模说明
如图3-4所示,通过参考官方提供的取模测试用例进行运算时,需要先进行取模运算的比较。然而规则test007只有一个匹配模式,属性约束条件也只有一个,我对需要添加括号产生了疑问。
![041-2](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/041-2.jpg?sign=1739336945-WUIdxcZMoPHtD79unqpxZKqa3pkdk4Ja-0-6a180a4d3be87f3ac1d303ea84fa4fb9)
图3-4 官方取模用例
为了验证官方文档上提到的使用括号方式是否正确,编辑规则添加的属性约束条件,添加“,age>10”。再次执行调用规则代码,结果与图3-4所示的效果一样。虽然测试失败了,但根据官方文档提供括号“()”的作用来看,应该可以解决以下问题。
编辑test007规则,其内容为:
rule "test007"
when
$p:Person((age%2)==0);
then
System.out.println("规则test007规则执行成功"+$p);
end
再次执行调用规则代码,结果如图3-5所示,也就是说,在%取模运算上,规则需要控制优先级,即先运算后匹配。
![041-3](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/041-3.jpg?sign=1739336945-7S7ir5XzfOmzn2lBjEDuVbVTLS2w59gC-0-e15fe707135ae28b2c7401b044e921c2)
图3-5 通过括号取模结果