Drools/Scala-在DRL中创建var/val

Drools/Scala-在DRL中创建var/val,scala,drools,Scala,Drools,我正在尝试将Drools与Scala结合使用,我想知道是否有可能在函数返回时调用事件链并创建var/val 以下是我正在尝试的,但我被卡住了: import com.models.* import com.service.* rule "First Fule" when person:Person(name == 'aa') then //Here should return a string //and i should set this string //s

我正在尝试将Drools与Scala结合使用,我想知道是否有可能在函数返回时调用事件链并创建var/val

以下是我正在尝试的,但我被卡住了:

import com.models.*
import com.service.*

rule "First Fule"
when
    person:Person(name == 'aa')
then
    //Here should return a string
    //and i should set this string
    //something like:
    //var x = new Person(ServiceLongDong.sayHello(), person.age, person.name)
    //or var y = ServiceLongDong.sayHello();
    ServiceLongDong.sayHello();
    ServiceLongDong.finish(x);
end
是否可以创建varl/VAL并将其传递给另一个函数

提前感谢。

规则不是函数(或方法),也不会“返回”值或对象。右边是Java代码。您可以调用静态方法,但要坚持正确的Java语法:

Person p = new Person(ServiceLongDong.sayHello(),
                      person.age, person.name);
ServiceLongDong.sayHello();
ServiceLongDong.finish(x);
如果ServiceLongDong是一个类,则这不可能是正确的Java:

... = ServiceLongDong().sayHello();

Scala有工厂类,作为OP的参考,所以它的语法是有效的。ServiceLongDong()返回可以调用sayHello()的实例。对于那些可以使用Drools的应用程序,您必须知道Scala编译器如何在外部设置API可见性,以便Drools能够访问。不过,为此编写Java适配器可能更容易。@kaskelotti Drools RHS(介于
then
end
之间的代码)是Java,因此您不能在那里使用其他任何东西。请注意,我写的是“不可能是正确的Java”,而不是“不可能是正确的”。这就是我的意思。Scala被编译成Java等效字节码。为了在Drools中使用这样的Scala构造,您需要知道界面在外部是如何可见的。因此,如果我想返回某个内容,我需要调用一个应该执行该操作的函数(即:调用一个方法在控制台上显示消息)?您有更好的选择。除了更合适的日志记录方式外:请参阅Drools文档中关于DRL全局和真相维护的内容。