7

我是 Drools 的新手。我正在创建规则,但出现编译时错误

“字段不可见”。

我尝试检查 Jboss 示例,他们使用方言 "mvel"。它编译。我不明白方言。那么是什么dialect=mvel

4

5 回答 5

14

mvel, 或MVFLEX 表达式语言 具有丰富的语法, 其中许多允许比 , 更简洁和富有表现力的代码 (和更少的命令) java, 例如

  • ters get()/ set()ters(例如封装私有字段)的简写,以另一种property样式语法访问(类似于.Net 中的 VB 或 C# 属性

IE。代替

myObject.setSomeField("SomeValue");
int x = myObject.getSomeIntField();

您可以使用语法(也请注意微妙的大写开关):

myObject.someField = "SomeValue"
x = myObject.someIntField // Type inferrence
  • return语句是可选的(在 Scala 等许多函数式语言中都有这种约定),分号也是如此,除非每行有多个语句:

x  // i.e. return x;
  • 按序数创建和索引的速记数组

foos = {2, 4, 6, 8, 10}
foos[3] // foos.get(3)
  • 地图(字典)也是如此

bars = ["a" : "Apple", "b" : "Basket"] // Hashmap, with put
bars["a"]
bars.a // Similar to dynamically typed object e.g. in javascript, if key is a string.
  • 空安全导航运算符(如 Rosyln 中的空条件运算符)

foo.?bar.baz // if (foo.bar != null) { return foo.bar.baz; } else { return null; }
于 2013-11-22T13:26:47.340 回答
4

基于

Drools JBoss Rules 5.0 开发者指南

方言用于指定条件或结果中的任何代码表达式中的语法。默认值为 Java。Drools 目前支持另一种称为 mvel 的方言。

具体来说,mvel 是一种用于基于 Java 的应用程序的表达式语言。它基于 Java 语法。有关 mvel 的更多信息

于 2013-10-11T18:17:19.510 回答
3
rule "validate holiday" 
    dialect "mvel"
    dialect "java"
    when
        $h1 : Holiday( month == "july" )
    then
        System.out.println($h1.name + ":" + $h1.month);
    end

方言“mvel”的目的是指向普通旧 Java 对象 (POJO) 类的变量的 Getter 和 Setter。考虑上面的示例,其中使用了 Holiday 类,并且在圆括号(括号)内使用了“月”。因此,借助方言“mvel”,可以访问变量“month”的 getter 和 setter。

方言“java”用于帮助我们在规则中编写 Java 代码。对此有一个限制或特征。我们不能在规则的“when”部分使用 Java 代码,但可以在“then”部分使用 Java 代码。

我们也可以声明一个不带 $ 符号的引用变量 $h1。对此没有任何限制。变量前加$符号的主要目的是为了标记POJO类的变量和Rules的区别。

问候。

于 2016-08-30T12:33:49.610 回答
0

如果您使用方言 mvel - 将修复您的错误。否则,该变量的范围默认是私有的,所以使用默认的 getter。获取字段()。将“字段”替换为 yoru 字段名。

您可以在 Business Central 的 Data Objects -> class -> source 选项卡中查看该类的源代码。

于 2018-10-19T13:38:40.270 回答
-1

我发现了一些关于这个的东西。我与那个分享了。Drools 支持 Java 或 MVEL 脚本语言。获取对象属性值。例如,斐波那契有 bean 并具有多个属性,即序列

rule Recurse
    salience 10
    when
        not ( Fibonacci ( sequence == 1 ) )    
        f : Fibonacci ( value == -1 )
    then
        insert( new Fibonacci( f.sequence - 1 ) );
        System.out.println( "recurse for " + f.sequence ); end

我们需要检查 if sequence ==1 then value is -1 .The sequence values are setting into Fibonacci object.We are check the values based on MVEL or java.MVEL is an superset of Java。

于 2013-06-23T11:57:10.737 回答