S: { name: string point: { x: int y: int }}// we can extend the fieldss: S & { data: bytes point: z: int}
定义(Definition) 默认是封闭的
定义默认会有个固定的结构,确定不会有额外的字段可以添加。
同样的对于它的所有字段也是一样的。
definition.cue
#D: { name: string data: { num: int }}// you can split the spec, this is not extension#D: tags: [...string]// after conjuncting, extension is not allowedd: #D & { meta: string data: { val: string }}
开放、封闭值
你可以使用 ... 开放定义(Definition),也可以使用 close 来封闭 struct。
但是不会递归的应用到所有的字段,只会针对使用关键字的字段生效。
open-n-close.cue
S: close({ name: string point: { x: int y: int }})s: S & {// this is no longer allowed data: bytes// this is still allowed point: z: int}#D: { name: string data: { num: int ... } ...}// this is now allowedd: #D & { meta: string data: { val: string }}
#D: { name: string data: { num: int }}// embed D into a new definition#L: { #D tags: [...string]}// after conjuncting, extension is not allowedd: #L & { meta: "meta" data: { num: 3 } tags: ["foo", "bar"]}
#D: { size: string data: { x: int y: int }}// after conjuncting, extension is not allowedd: #D & { data: { x: 3 y: 4 } _calc: data.x * data.y size: string|*"med"if _calc <10 { size: "small" }if _calc >100 { size: "large" }}
List 的封闭性
List 的开放和封闭性比 struct 和 定义 的要简单很多,如果使用了省略号(...),list 就是开放的。
任何固定的元素都需要在确定的位置上,类型必须对应。
list.cue
// an open listL1: [...]// one element list with any typeL2: [_]// an int list with at least one elementL3: [int, ...]// a mixed list of four elementsL4: [int, string, {...}, _]// you can concatenate lists tooL5: L2 + L3 // openL6: L2 + L4 // closedL7: L3 + L2 // closed, L3 ellipses removed// You cannot append or reopen like thisL2: L2 + [...]