当前位置: 首页 > 知识库问答 >
问题:

当2个对象共享一个属性时触发的Drools规则

赵夕
2023-03-14
rule "704.5j. If two or more planeswalkers that share a planeswalker type are on the battlefield, all are put into their owners' graveyards. This is called the 'planeswalker uniqueness rule'."
    when
        $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , $subtype : Types.get(1) , $c1ID : ID );
        $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") , Types.contains($subtype) , ID != $c1ID);
    then
        System.out.println("PW Uniqueness: " + $c1.getName() + " | " + $c2.getName());
        $c1.setCurrentZone(ZoneType.Graveyard);
        $c2.setCurrentZone(ZoneType.Graveyard);
end

我必须在java方面这样做吗?

编辑:同时,非常欢迎针对Drools的教程/指南建议。

共有1个答案

南门向荣
2023-03-14

如果你还没有做到这一点,也许可以将一个部分移到Then部分的If中,以避免在when中声明内容,然后在同一个部分中召回它,

rule "704.5j. If two or more planeswalkers that share a planeswalker type are on the battlefield, all are put into their owners' graveyards. This is called the 'planeswalker uniqueness rule'."
when
    $c1 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype : Types.get(1)));
    $c2 : Card (CurrentZone == ZoneType.Battlefield , Types.contains("Planeswalker") ,($subtype2 : Types.get(1)) );
then
    if (($subtype == $subtype2) && ($c1.getID() == $c2.getID()))
    {
       System.out.println("PW Uniqueness: " + $c1.getName() + " | " + $c2.getName());
       $c1.setCurrentZone(ZoneType.Graveyard);
       $c2.setCurrentZone(ZoneType.Graveyard);
    }
end

这有点冗长。但是我通常避免在When中声明和检查相同的变量,我声明我需要的一切(大多数时候使用数组和evals),然后在then中检查IF状态。

同样,正如@Marko所说,将第一个属性取下来,检查它的工作情况,然后一次只添加一个检查。有时我会用大量愚蠢的IFs等构建大规则,一旦它起作用了。我开始缩小尺寸。减少一件工作的东西比修复一件小坏的东西容易:)

 类似资料:
  • 假设我有一个议程组“daily”,它有两组drools规则集A有规则“default-1”,“default-2”,“default-3”,集B有规则“custom-1”,“custom-2”,“custom-3” 当议程组“daily”变得集中,并且当前事实与自定义模式匹配时,我只希望“custom-1”和/或“custom-2”和/或“custom-3”触发;否则,只有“Default-1”和

  • 我有一个简单的JAVA bean,有两个int字段:'a'和'b'。 更新 非常感谢你的回答。 也许我应该详细描述一下我的问题。我有一套1500条规则。每条规则: null Java代码: 解决方案2的DRL文件:我向每个规则添加了相同的激活组:

  • 我有一个多用途的传感器,每个传感器发送计步器数据。我有一个基于macAddress的规则文件,触发规则: My User只有一个字段,Steps事件有以下字段: 现在,当我为每个macAddress插入一个事件时,如果在过去一小时内使用该macAddress的用户的步骤数少于50,则规则将触发。因此,如果满足此条件,则该规则将为每个macAddress触发。但我希望规则只能为插入的步骤事件的mac

  • 如果我向Drools引擎添加一个事实,我有一组正确工作的Drools规则,如果我添加两个事实,这些规则只应用于第一个事实。如何使规则集适用于多个事实? 我的可追踪事实: 我的规则集: 失败的测试用例:

  • 假设我们有一个这样定义的对象A: 出于某种原因,我需要创建第二个对象B,它只具有对象A的前两个属性: 所以我的问题是:将对象A复制到对象B的最佳方法是什么?我一直在逐个复制获取者和设置者的属性,但有些事情告诉我一定有更好的方法来做到这一点!特别是当对象将具有很多属性时,我必须编写一行又一行的代码,只是为了将它们全部复制到第二个对象B... 多谢了:) 编辑:我一直被一个“另一个问题的可能重复”提醒