Rego数组赋值后长度为0原因及正确数组赋值方法问询
问题1:为什么count(c) > 0判断结果为false
Rego是声明式的逻辑编程语言,所有变量均为不可变的单次绑定:
- 你代码中首先用
c := []将变量c绑定为了空数组,这个绑定一旦生效就无法修改 - 后续的
c = array.concat(a,b)不是赋值操作,而是相等约束:要求已经绑定为空数组的c必须等于array.concat(a,b)返回的[1,2,3,4] - 这个约束显然不成立,因此整个规则体的逻辑判定为假,规则
x无返回结果,最终输出空数组。此时c的值始终是空数组,所以count(c) > 0结果为false。
问题2:如何实现数组拼接的需求
Rego没有「修改已有变量值」的概念,不需要预先初始化空数组再赋值,直接将拼接结果绑定到变量即可。
你场景的正确写法如下:
package play func[{"msg": msg}] = c { a := [1,2] b := [3,4] # 直接绑定c为拼接结果,无需提前初始化 c := array.concat(a, b) msg := "拼接完成" } # 对应你最初的x规则正确写法: x[{"msg": msg}] { a := [1,2] b := [3,4] c := array.concat(a, b) count(c) > 0 msg := "Length of c is greater than zero" }
执行后的输出结果为:
{ "func": [ { "msg": "拼接完成" } ], "x": [ { "msg": "Length of c is greater than zero" } ] }
内容的提问来源于stack exchange,提问作者Lior Kesten
相关产品推荐
相关产品推荐

