侧边栏壁纸
  • 累计撰写 106 篇文章
  • 累计创建 3 个标签
  • 累计收到 19 条评论
标签搜索

目 录CONTENT

文章目录

Drools入门之规则then

卑微幻想家
2022-07-06 / 0 评论 / 0 点赞 / 64 阅读 / 1,345 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-07-06,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

update(Fact事实对象):它会告诉引擎一个对象已经改变了(一个绑定到LHS部分上的引用,即p:Person中的p:Person中的p),修改成功后在工作内存中会发生变化,可能会导致规则再次被激活。在经典的Hello World章节中有例子说明。只有真正将工作内存中的值改变时,其他规则体才能正常对变化后的Fact事实对象进行判断操作。

insert(new Object()):将一个新的Fact事实对象放入工作内存中。它不仅可以操作引用的Fact事实对象,还可以操作declare声明的Fact事实对象。这一点在declare声明章节有过说明。

insertLogical(new Object()):与insert类似,但是当没有更多的事实来支持当前触发规则的LHS部分时,该Fact事实对象将被自动删除。使用的并不是很多。delete(handle):从工作内存中删除一个Fact事实对象,其语法与update相似,都是通过引用LHS部分上绑定的值。

Update是修改Fact事实对象的一种方式,Drools还提供了另一种方式,即modfiy,modfiy的功能与update是一样的,但写法却有很大的不同。

modfiy的语言扩展为事实更新提供了结构化的方法,它将更新操作与多个设置器调用相结合,以更改对象的字段,其代码结构为:

modify ( <fact-expression> ) {
    <expression> [ , <expression> ]*
}

括号的<fact-expression> 必须产生一个事实对象引用。{}中的表达式列表应该由给定对象的setter调用组成,不需要通常的对象引用来编写,这是由编译器自动添加的,下面通过一个例子来具体说明。

rule "modify rule"
    when
        $p:Person(age == 30)
    then
        modify($p){
            setAge(32),
            setDous(20),
            setName("李飞飞")
        }
        System.out.println("modify 修改:"+$p);
end

通过上述例子可以看出,modify与update是不一样的,update必须先对Fact事实对象的引用值进行setter操作,再执行update命名。而modify需要在参数中先对Fact事实对象进行引用,在块中进行setter调用。

Drools为RHS部分提供了几个操作命名,下面分别进行介绍。

drools.halt():立即终止规则执行。只要有一条规则执行了drools.halt(),则其他规则将不再进行判断,直接返回结束。这也是常用的一种手段。

drools.getWorkingMemory():返回WorkingMemory对象。

drools.setFocus(String s):将焦点放在指定的议程组上。

drools.getRule().getName():返回规则的名称。

drools.getTuple():返回与当前正在执行的规则匹配的数组,并且为drools.getActivation()提供相应的激活(这些调用对于日志记录和调试很有用)。

0

评论区