3
violation[{"msg": msg}] {
    required:= ["red", "green", "blue"]
    input := ["orange", "purple"]

    msg := sprintf("")
}

我想比较所需数组中输入数组中的每个值。在其他语言中,两个正常的循环会做到这一点。但在 Rego 语言中,它们不是循环。有谁知道我该怎么做

4

2 回答 2

1

colorSetrequiredSet变量显示了如何将数组转换为集合。

使用==运算符我们可以确定是否所有颜色都存在

package play

default allColorPresent = false

allColorPresent  {
   colorSet := {x | x := input.colors[_]} 
   requiredSet := {x | x := input. required[_]}
   colorSet == requiredSet
}
于 2021-08-02T07:40:29.293 回答
0

有关如何迭代集合的信息,请参阅有关迭代的文档部分。然而,使用集合通常更惯用。按照你的例子:

violation[{"msg": msg}] {
    required := {"red", "green", "blue"}
    input.colors := {"orange", "purple"}
    
    count(required - input.colors) != 0

    msg := sprintf("input.colors (%v) does not contain all required colors (%v), [input.colors, required]")
}

于 2020-11-17T22:15:26.350 回答