You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 12:05:56