protobuf3のenumのscope

protoのenumのスコープ

概要

  • enumを宣言する際に考慮する点のメモ

enumのscoping rule

enum valueはC++のスコープルールに準拠している。
unscoped enumerationとscoped enumerationがあり、unscoped enumerationで名前がかぶると

Note that enum values use C++ scoping rules, meaning that enum values are siblings of their type, not children of it

というエラーで弾かれる。

enum Enum1{  
    X=0;
    Y=1;    
}

~

enum Enum2{  
    X=0;
    Z=1;    
}

scoped enumeration

下記の様に、messageでencloseすることで、scoped enumerationとなるためエラーは発生しない。

message Enum1{  
 enum Enum{
     X=0;
     Y=1;    
 }
}

message Enum2{  
 enum Enum{
     X=0;
     Y=1;    
 }
}

prefixing enumeration

または、prefixをつけることで対応も可能。

enum Enum1{  
    E1_X=0;
    E1_Y=1;    
}
enum Enum2{  
    E2_X=0;
    E2_Z=1;    
}

google style guideではprefixing enumが推奨される。

zero value enum

zero value enumにはsuffix UNSPECIFIEDを利用することが推奨される。

enum Foo {  
  FOO_UNSPECIFIED = 0;
  FOO_FIRST_VALUE = 1;
  FOO_SECOND_VALUE = 2;
}