Jsonnet中如何实现格式化字符串的分步插值?
Jsonnet分步字符串插值解决方案
你的代码无法编译的原因是:Jsonnet的%字符串格式化操作要求一次性提供格式字符串中所有占位符对应的参数,如果有占位符未被覆盖,就会触发编译错误。所以分两次使用%来分步替换是行不通的。
针对你的需求(固定初始格式字符串,无法可靠解析格式字符串),可以通过手动字符串替换的方式实现分步插值,具体方案如下:
方案1:单个占位符分步替换
使用Jsonnet标准库的std.strReplace函数,逐个替换占位符:
local formatString = "Name: %(a)s Age: %(b)s"; // 第一步替换a占位符 local step1 = std.strReplace(formatString, "%(a)s", "a"); // 第二步替换b占位符 local step2 = std.strReplace(step1, "%(b)s", "1"); { asd: step2 }
方案2:批量替换占位符(更通用)
如果需要替换多个占位符,可以封装一个批量替换函数,支持每次传入部分参数进行替换:
local replacePlaceholders(str, params) = std.foldl( (acc, [key, val]) => std.strReplace(acc, "%(" + key + ")s", val), std.objectFields(params), str ); local formatString = "Name: %(a)s Age: %(b)s"; // 第一步替换a参数 local step1 = replacePlaceholders(formatString, {a: "a"}); // 第二步替换b参数 local step2 = replacePlaceholders(step1, {b: "1"}); { asd: step2 }
这两种方式都能实现分步插值的需求,且不需要解析原始格式字符串的结构,完全适配你提到的“初始格式化字符串固定”的场景。
内容的提问来源于stack exchange,提问作者Nate W
相关产品推荐
相关产品推荐

