【问题标题】:Creating new Scala object in Drools right hand side在 Drools 右侧创建新的 Scala 对象
【发布时间】:2015-02-04 14:12:28
【问题描述】:

由于我在 Drools 中使用 Scala 不可变对象,为了更新一个事实,我需要创建一个新对象来替换它。我已经为要调用的规则编写了一个 Scala 方法,它只返回这样一个对象。

我的问题是,在 Drools 规则的“then”部分定义新的 Scala 案例类对象的语法是什么?我已经尝试过类似于我在某处看到的以下语法,但它似乎也没有起到作用......(即使对于像字符串这样的标准类型)

then
    MyObject t = returnNewMyObject($a, $b)

目前对 Drools + Scala 的支持和文档似乎相当有限。有什么想法吗?

(仅供参考,我已阅读以下问题,但不是同一个查询...我的对象不是全局对象:Drools Expert output object in Scala

DRL 文件如下:

package resources

import function drools.RuleFunctions.*
import order.Cart
import order.CartLine
import generic.Amount

import scala.*
import scala.Option
import org.kie.api.runtime.KieRuntime
import java.math.BigDecimal


    dialect  "mvel"


    rule "Eval Cart Line"  
        agenda-group "init"
        auto-focus true
        dialect  "mvel"
        lock-on-active true
        salience 1000
        when
             $cart: Cart($line: lines(), amount == null) //If Cart found with lines, but with no cart amount set
             $o : CartLine($id : ref, $qty: quantity) from $line
        then
            Cart $newB = updateLineAmount($cart, $id, $qty, kcontext.getKieRuntime())
            update(kcontext.getKieRuntime().getFactHandle($cart),$newB) 
    end

    rule "Product 20% Discount"
        agenda-group "LineDiscount"
        auto-focus true
        dialect  "mvel"
        lock-on-active true
        salience 900
        when
            $cart: Cart($line : lines, amount == null)
            $o : CartLine(ref == "1234", amount != null ) from $line
        then
            Cart $newB = addLineDiscount($cart, $o, 20.0, kcontext.KieRuntime())
            update(kcontext.getKieRuntime().getFactHandle($cart), $newB)
        end

更新

object RuleFunctions {

  def updateLineAmount(cart: Cart, id: String, qty: Int, krt: KieRuntime): Cart= {...}

  def addLineDiscount(cart: Cart, bLine : CartLine, discPerc: Double, krt: KieRuntime): Cart= {...}
}

【问题讨论】:

  • 如果 MyObject 被定义为一个案例类,并且您的 returnNewMyObject 返回它的一个实例,那么我看不到这个问题。请澄清...
  • 是的,错误信息中很清楚。编译器对 addLineDiscount 一无所知。您必须为其提供对具有该方法的对象的句柄/引用。你试过吗?
  • 你应该关闭严格模式。
  • 评论不用于扩展讨论;这个对话是moved to chat
  • 我不确定 Drools 是否可以使用 Scala。问题是 Scala Object 类型中的方法是隐式静态的。这就是将它们放在那里的全部意义所在。在 Java 中,您必须明确声明该方法是静态的。我在想,当 Scala Object 类型被编译成字节码时,它与具有静态方法的等效 Java 类不同。更具体地说,我认为 Drools 无法接受从 Scala Object 类型导入静态方法这一事实。

标签: scala drools


【解决方案1】:

从 Scala 对象类型导入方法在 Drools 中可能会出现问题。原因很简单,与 Java 相比,Scala 中不存在 static 方法。这是因为 Scala 对纯面向对象语言的含义进行了更严格的解释。

这意味着每当您尝试使用 Drools import function 语法时,它都找不到要导入的任何静态方法。因此,Drools 编译器会抱怨对 Scala 单例对象类型中包含的方法的任何引用。

解决此问题的方法是编写将在 Java 中的 DRL 中使用的任何类,您可以在其中显式定义静态方法。 Scala 编译器会很乐意将这些与您的 Scala 类一起编译。

【讨论】:

  • @placplacboom I.K.还有 GroomedGorilla,我从 Mark Proctor 本人那里得知 Drools 团队尚未验证 Scala 与 Drools 的结合。有计划在下一个次要版本 (6.1) 之后执行此操作。没有声明它应该理所当然地工作,并且在那个 Drools 列表上没有任何其他反应。您知道或可以查看 SO 上讨论的内容。
猜你喜欢
  • 2019-12-24
  • 2011-12-15
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多