![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=1738854892-zMA49SZNC3NIUNXYeUxZfsjtYw8hfXVf-0-5e88c59ff3525990502c4d758a25b724)
图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=1738854892-9O0v46vJMSMHLE0I9tiQRUUmvQrKCirl-0-1c5dfb1924e3965ae771fff887686275)
图3-2 取模操作异常结果
为了验证测用例的语法是否正确,查阅官方文档后,找到取模运算符的操作,证明是可以使用的,如图3-3所示。
![041-1](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/041-1.jpg?sign=1738854892-fZ9Ct8e2gGy95p2fFHIumxyrjhqHnFln-0-b3f3498492e4430dd0125ea38dba8a13)
图3-3 官方取模说明
如图3-4所示,通过参考官方提供的取模测试用例进行运算时,需要先进行取模运算的比较。然而规则test007只有一个匹配模式,属性约束条件也只有一个,我对需要添加括号产生了疑问。
![041-2](https://epubservercos.yuewen.com/CC3313/15279444705239206/epubprivate/OEBPS/Images/041-2.jpg?sign=1738854892-bVZn0SMB9fSRgCcybafzEsIlftsd6ACo-0-1f350777be099561601de55cf5e92d8b)
图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=1738854892-IZM0oFB9YIXOH0bpoweL6L0KbKAK7CCP-0-e5f41075f4a94cab2ccf3d358368d9ae)
图3-5 通过括号取模结果