Rego set comprehension不同场景下undefined返回结果差异咨询
Rego集合推导式在两种场景下的结果差异说明
两者结果不同的根本原因是Rego对不同作用域下的赋值、空结构返回的判定规则不一致,核心逻辑可以拆分为三点:
- 首先明确集合推导式的基础求值逻辑:当推导式内部的条件没有任何可匹配的分支时(比如示例中
foo["c"]不存在,没有值能满足元素生成条件),推导式本身会生成对应类型的空结构,set推导式对应的就是空集合set()。 - 函数封装场景返回空集合的原因:自定义函数的规则体内部对局部变量的
:=赋值采用容错绑定逻辑,只要表达式能生成合法类型的值(哪怕是空集合),就会正常完成变量绑定,最终将值作为函数返回值输出。示例中推导式生成的空集合会被正常绑定给rlt变量,因此函数最终返回空集合,不会向外传递undefined。 - 顶层直接赋值返回undefined的原因:顶层作用域的全局
:=赋值会额外做规则有效性校验:如果赋值右侧的推导式结果是空结构,Rego会判定这个规则没有产生有效绑定,整个赋值语句判定为求值失败,对应的变量不会绑定任何值,对外表现就是undefined。
你可以自行验证:将示例中的set推导式替换为数组推导式、对象推导式重复测试,会得到完全一致的表现:函数封装时返回对应类型的空结构,顶层直接赋值时返回undefined。如果给推导式增加一个必然成立的生成条件,让推导式产出非空结果,两个场景的返回值会完全一致。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

