【问题标题】:Check if array contained within another in rego检查数组是否包含在 rego 中的另一个中
【发布时间】:2021-10-26 08:21:23
【问题描述】:

我有两个数组:xy 我想检查x 是否包含在y 中。

rego 中没有 contains() 函数。

接下来我尝试创建与 contains() 函数等效的数学函数:

x ⊆ y ⇔ (x ⋂ y) == x.

所以我尝试执行以下操作:

z := x & y
x == z

但这会产生以下错误:

rego_type_error: and: 无效参数 有: (array[any], any, ???) 想要: (set[any], set[any], set[any])

那我该怎么做呢?

【问题讨论】:

    标签: arrays set contains open-policy-agent rego


    【解决方案1】:

    Set operations 仅适用于.. 好吧,设置 :) 如果您创建 x y 作为新设置(只需使用 {...} 而不是 [...])您的示例应该可以工作。如果 xy 是数组 - 就像引用来自 input 的值时经常出现的情况一样 - 您可以使用集合推导来转换它们,例如:

    xs := {e | e := x[_]}
    ys := {e | e := y[_]}
    

    然后使用xsys 作为集合。另一方面,如果你真的想使用数组(比如在排序和重复值很重要的时候),你可以这样做:

    contained {
        y[i]
        x == array.slice(y, i, i + count(x))
    }
    

    这将遍历y 数组,并为每个项目从i 创建一个与x 数组长度相同的y 切片,如果一个这样的切片等于x.

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      相关资源
      最近更新 更多