如果我们在 OPA 的规则体中定义了它,为什么我们无法评估它?

Why we are unable to evaluate comprehension if we have defined it inside a rule body in OPA?

下面是我的示例代码:https://play.openpolicyagent.org/p/oyY1GOsYaf

这里,当我尝试计算 names 数组时,它显示: error occurred: 1:1: rego_unsafe_var_error: var names is unsafe

但是当我在允许规则定义之外定义相同的理解时:https://play.openpolicyagent.org/p/Xv0cF7FM8b,我能够评估选择

[
"smoke",
"dev"]

有人可以帮我指出不同之处吗?如果我想在规则中定义理解,是否需要遵循任何语法?提前致谢

注意:在这两种情况下,我都得到了预期的最终输出,唯一的问题是 names 数组评估。

Rego Playground 在评估 selection 时生成查询的方式比人们想象的要简单得多。将从您的 selected 文本生成一个查询,而不考虑该文本在文档中 selected 的位置。这意味着即使您 select 规则主体中的局部变量,查询也将只包含该变量名称(names,在您的情况下);这将被视为对文档正文中顶级变量的引用,即使规则局部变量是 selected。这就是为什么您的第一个示例 returns 出错,因为文档中没有顶级变量 names;而第二个样本确实如此,因此成功了。

您可以通过 select 对第 3 行的单词 hello 进行评估来测试这个怪癖:https://play.openpolicyagent.org/p/n5OPoFnlhx.

package play
    
# hello
    
hello {
    m := input.message
    m == "world"
}

即使它只是评论的一部分,它也会像您在第 5 行 select编辑规则名称一样进行评估。