9.12. 联合内置类型

联合内置类型表示一个对应于其成员类型之一的值。

当类型是“union”时,“type”语句(7.4节)必须存在。 它重复用于指定联合的每个成员类型。 它以一个字符串作为参数,它是一个成员类型的名称。

成员类型可以是任何内置类型或派生类型。

在生成XML编码时,根据值所属成员类型的规则对值进行编码。 在解释XML编码时,将按照每个成员类型(在“type”语句中指定的顺序)对值进行连续验证,直到找到匹配项为止。 匹配的类型将是被验证的节点的值的类型,并根据该类型的规则解释编码。

成员类型中定义的任何默认值或“units”属性均不由联合类型继承。

9.12.1. 限制

工会不能被限制。 但是,根据第9节中定义的规则,每个成员类型都可以被限制。

9.12.2. 词汇表示

联合的词汇表示是与任何一个成员类型的表示相对应的值。

9.12.3. 规范形式

联合值的规范形式与值的成员类型的规范形式相同。

9.12.4. 使用示例

以下是int32和枚举的联合:

  1. type union {
  2. type int32;
  3. type enumeration {
  4. enum "unbounded";
  5. }
  6. }

当成员类型是“require-instance”属性(第9.9.3节)为“true”的leafref时,必须小心。 如果这种类型的叶片引用了现有的实例,则如果目标实例被删除,叶片的值必须重新确认。 例如,具有以下定义:

  1. list filter {
  2. key name;
  3. leaf name {
  4. type string;
  5. }
  6. ...
  7. }
  8. leaf outbound-filter {
  9. type union {
  10. type leafref {
  11. path "/filter/name";
  12. }
  13. type enumeration {
  14. enum default-filter;
  15. }
  16. }
  17. }

假设筛选器列表中存在名称为“http”的条目,并且出站筛选器叶具有以下值:

  1. <filter>
  2. <name>http</name>
  3. </filter>
  4. <outbound-filter>http</outbound-filter>

如果删除了筛选器条目“http”,则出站筛选器页面的值与leafref不匹配,并检查下一个成员类型。 当前值(“http”)与枚举不匹配,所以生成的配置无效。

如果联合中的第二个成员类型的类型是“string”而不是枚举类型,则当前值将会匹配,并且生成的配置将是有效的。