9.12. 联合内置类型
联合内置类型表示一个对应于其成员类型之一的值。
当类型是“union
”时,“type
”语句(7.4节)必须存在。 它重复用于指定联合的每个成员类型。 它以一个字符串作为参数,它是一个成员类型的名称。
成员类型可以是任何内置类型或派生类型。
在生成XML
编码时,根据值所属成员类型的规则对值进行编码。 在解释XML
编码时,将按照每个成员类型(在“type
”语句中指定的顺序)对值进行连续验证,直到找到匹配项为止。 匹配的类型将是被验证的节点的值的类型,并根据该类型的规则解释编码。
成员类型中定义的任何默认值或“units
”属性均不由联合类型继承。
9.12.1. 限制
工会不能被限制。 但是,根据第9节中定义的规则,每个成员类型都可以被限制。
9.12.2. 词汇表示
联合的词汇表示是与任何一个成员类型的表示相对应的值。
9.12.3. 规范形式
联合值的规范形式与值的成员类型的规范形式相同。
9.12.4. 使用示例
以下是int32
和枚举的联合:
type union {
type int32;
type enumeration {
enum "unbounded";
}
}
当成员类型是“require-instance
”属性(第9.9.3节)为“true
”的leafref
时,必须小心。 如果这种类型的叶片引用了现有的实例,则如果目标实例被删除,叶片的值必须重新确认。 例如,具有以下定义:
list filter {
key name;
leaf name {
type string;
}
...
}
leaf outbound-filter {
type union {
type leafref {
path "/filter/name";
}
type enumeration {
enum default-filter;
}
}
}
假设筛选器列表中存在名称为“http
”的条目,并且出站筛选器叶具有以下值:
<filter>
<name>http</name>
</filter>
<outbound-filter>http</outbound-filter>
如果删除了筛选器条目“http
”,则出站筛选器页面的值与leafref
不匹配,并检查下一个成员类型。 当前值(“http
”)与枚举不匹配,所以生成的配置无效。
如果联合中的第二个成员类型的类型是“string
”而不是枚举类型,则当前值将会匹配,并且生成的配置将是有效的。