《Drools7.0.0.Final规则引擎教程》第4章 4.4 LHS简介&Pattern

LHS简介

在规则文件组成章节,我们已经了解了LHS的基本使用说明。LHS是规则条件部分的统称,由0个或多个条件元素组成。前面我们已经提到,如果没有条件元素那么默认就是true。 没有条件元素,官方示例:

rule "no CEs"
when
    // empty
then
    ... // actions (executed once)
end

// The above rule is internally rewritten as:

rule "eval(true)"
when
    eval( true )
then
    ... // actions (executed once)
end

如果有多条规则元素,默认它们之间是“和”的关系,也就是说必须同时满足所有的条件元素才会触发规则。官方示例:

rule "2 unconnected patterns"
when
    Pattern1()
    Pattern2()
then
    ... // actions
end

// The above rule is internally rewritten as:

rule "2 and connected patterns"
when
    Pattern1()
    and Pattern2()
then
    ... // actions
end

和“or”不一样,“and”不具有优先绑定的功能。因为生命一次只能绑定一个FACT对象,而当使用and时就无法确定声明的变量绑定到哪个对象上了。以下代码会编译出错。

person : (Person( name == "Romeo" ) and Person( name == "Juliet"))

Pattern (条件元素)

Pattern元素是最重要的一个条件元素,它可以匹配到插入working memory中的每个FACT对象。一个Pattern包含0到多个约束条件,同时可以选择性的进行绑定。

通过上图可以明确的知道Pattern的使用方式,左边变量定义,然后用冒号分割。右边pattern对象的类型也就是FACT对象,后面可以在括号内添加多个约束条件。最简单的一种形式就是,只有FACT对象,没有约束条件,这样一个pattern配到指定的patternType类即可。

比如,下面的pattern定义表示匹配Working Memory中所有的Person对象。

Person()

pattemType并不需要使用实际存在的FACT类,比如下面的定义表示匹配Working Memory中所有的对象。很明显,Object是所有类的父类。

Object() // 匹配working memory中的所有对象

如下面的示例,括号内的表达式决定了当前条件是否会被匹配到,这也是实际应用中最常见的使用方法。

Person( age == 100 )

Pattern绑定:当匹配到对象时,可以将FACT对象绑定到指定的变量上。这里的用法类似于java的变量定义。绑定之后,在后面就可以直接使用此变量。

rule ...
when
    $p : Person()
then
    System.out.println( "Person " + $p );
end

其中前缀$只是一个约定标识,有助于在复杂的规则中轻松区分变量和字段,但并不强制要求必须添加此前缀。

后语

此系列课程持续更新中,QQ群:593177274,欢迎大家加入讨论。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

Python字节码介绍

如果你曾经编写亦或只是使用Python语言,那么你可能已经习惯了看Python源码文件; 源码的文件名以.py结尾。或许你也已经注意到了另一种类型的文件,文件名...

983
来自专栏DannyHoo的专栏

字符串(NSString)、字典(NSDictionary)、数组(NSArray)的总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

772
来自专栏逸鹏说道

Python3 与 C# 面向对象之~封装

原文:https://www.cnblogs.com/dotnetcrazy/p/9202988.html

1533
来自专栏逸鹏说道

Python3 与 C# 面向对象之~封装

在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lessch...

663
来自专栏偏前端工程师的驿站

Java魔法堂:类加载机制入了个门

一、前言                                 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序...

1867
来自专栏深入浅出区块链技术

Solidity 教程系列3 - 函数类型

Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊、智能合约有所了解,如果你还不了解,建议你先看以太坊是什么

702
来自专栏python3

习题34:模块,类,对象

创建一个名字叫mystuff.py文件,并且在里面放了个叫做apple的函数,代码如下

724
来自专栏余林丰

Java中net.sf.json包关于JSON与对象互转的坑

  在Web开发过程中离不开数据的交互,这就需要规定交互数据的相关格式,以便数据在客户端与服务器之间进行传递。数据的格式通常有2种:1、xml;2、JSON。通...

2195
来自专栏WindCoder

JSON中关于对双向关联的支持

本文原文:Bidirectional Relationship Support in JSON

772
来自专栏北京马哥教育

Python程序员最常犯的十个错误,看完你自己都笑了

本文由马哥教育Python自动化实战班4期学员推荐,转载自简书,作者为EarlGrey,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。 ...

2604

扫码关注云+社区