【问题标题】:Arithmetic operators in drools流口水中的算术运算符
【发布时间】:2020-10-01 14:21:03
【问题描述】:

我正在尝试用 Drools 语言实现规则。我需要将两个变量的两个整数值相加。我尝试了一些不同的方法,但它们似乎都不起作用。由于“+”符号或“eval”功能,我得到了失败。我需要进行求和,然后将其值与另一个值进行比较以触发规则。这些是我已经尝试过的组合

     $generationGrain : ($smallerGenerationIndex.intValue() + App.GENERATION_TIME.intValue() ) 
    
     $generationGrain : $smallerGenerationIndex.intValue() + App.GENERATION_TIME.intValue()
 
     $generationGrain : eval($smallerGenerationIndex.intValue() + App.GENERATION_TIME.intValue())
     
     $generationGrain : eval($smallerGenerationIndex + App.GENERATION_TIME)
    
     $generationGrain : ($smallerGenerationIndex + App.GENERATION_TIME )  
    
     $generationGrain : ($smallerGenerationIndex.intValue() + App.GENERATION_TIME.intValue() ) 

是无法做到还是我错过了什么?我是否应该在then 之后创建一个带有求和的规则,然后再创建一个带有条件和另一个值的规则?

【问题讨论】:

    标签: constraints drools arithmetic-expressions


    【解决方案1】:

    整数有一个static sum operation,您可以在这种情况下使用。

    $generationGrain: Integer() from Integer.sum( $smallerGenerationIndex, App.GENERATION_TIME )
    

    这也可以让您应用约束。例如,如果您想编写一条规则,使其仅在总和为负时触发,您可以这样做:

    $generationGrain: Integer(this < 0) from ...
    

    或者,如果您想对对象列表中的值求和,可以使用 accumulatesum 函数。但是对于两个离散的数字,我会这样做。

    (其他数字包装类型也有类似的功能,例如。Double。)

    【讨论】:

      【解决方案2】:

      您正在尝试重用业务名称并将业务名称用于某些计算。 DSL 适合这里

      [when]SmallerGenerationIndex = $smallerGenerationIndex.intValue()
      [when]GenerationTime = App.GENERATION_TIME.intValue()
      [when]GenerationGrain = (SmallerGenerationIndex + GenerationTime)
      

      现在在规则中你可以重用具有明确业务意义的值,每次都会解析为更长的表达式,但这些技术性的东西会被人看到。

      【讨论】:

        猜你喜欢
        • 2022-01-07
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-02
        相关资源
        最近更新 更多