为何默认值为引用时,*前缀标记的是优先值而非默认值?
CUE中引用字段作为默认值的语法问题
查阅CUE文档的「默认值」章节后,我了解到定义字段默认值的语法如下:
name: string | *"unknown"
这是一个析取表达式(disjunction),其中"unknown"前缀带有*,即回退用的默认值需要添加*前缀。
但当默认值是对其他字段的引用时,最初的写法结果不符合预期:
a: int b?: int a: 1 b: 2 c: a d: b | *a
输出:
a: 1 b: 2 c: 1 d: 1
我的需求是:a为必填字段,b为可选字段,c直接使用a的值,d优先用b的值,若b未提供则默认使用a的值。我给a加了*标记为默认值,但即使b已定义,d最终还是取了a的值1。
交换*前缀的位置后就能正常工作:
a: int b?: int a: 1 b: 2 c: a d: *b | a
输出:
a: 1 b: 2 c: 1 d: 2
此时d取得了预期值2;当不定义b时,也能正常回退到a的值:
a: int b?: int a: 1 //b: 2 c: a d: *b | a
输出:
a: 1 c: 1 d: 1
我没在CUE文档里找到针对默认值为引用字段的语法说明,但在「为字段指定默认值」页面看到以下内容,让我怀疑是不是用错了实现方式:
如上所示,若字段有多个默认值但无法成功统一,CUE会视为未设置默认值。因此,默认值不能用作多层覆盖的机制。
内容的提问来源于stack exchange,提问作者Matt Welke
相关产品推荐
相关产品推荐

