如何在Rego函数中返回单个值?优化数组返回逻辑
问题描述
我编写了如下Rego代码,用于从输入的labels中提取retry计数:
retry_count_key := "retry" get_retries_count(str) := {x | some i parts := split(str[i], ":") parts[0] == retry_count_key x := to_number(parts[1]) } max_retry_label := get_retries_count(input.labels)
当输入如下JSON数据时:
{ "labels": [ "retry:5", "test" ] }
max_retry_label始终返回数字数组,结果为{"max_retry_label": [5]},但我希望它直接返回单个数字{"max_retry_label": 5}。目前能用sum(get_retries_count(input.labels))这种取巧方式,但想在函数内部实现该逻辑,避免后续开发者额外处理。
解决方案
原函数用大括号{}定义了集合规则,所以即使只有一个匹配元素,也会以数组形式返回。要直接返回单个值,有两种简单的修改方式:
方法1:改成单值绑定规则
直接将函数调整为单值返回的形式,因为labels中通常只会有一个retry:开头的标签:
retry_count_key := "retry" get_retries_count(str) := x { some i parts := split(str[i], ":") parts[0] == retry_count_key x := to_number(parts[1]) } max_retry_label := get_retries_count(input.labels)
把原函数的{x | ...}换成x { ... },规则匹配时就会直接返回单个值x,而非集合。
方法2:提取集合的唯一元素
如果需要兼容可能存在多个retry标签的场景(比如取第一个匹配值),可以在函数内部用head函数提取集合的第一个元素:
retry_count_key := "retry" get_retries_count(str) := head({x | some i parts := split(str[i], ":") parts[0] == retry_count_key x := to_number(parts[1]) }) max_retry_label := get_retries_count(input.labels)
head会直接返回集合的第一个元素,单个元素时就返回该数字,多个元素时返回第一个匹配项。
测试结果
用给定的输入测试,两种方法都会得到预期结果:
{"max_retry_label": 5}
内容的提问来源于stack exchange,提问作者Joey Stout
相关产品推荐
相关产品推荐

