将默认枚举值设为'未指定'的目的是什么?在谷歌protobuf?

时间:2018-02-16 19:08:47

标签: protocol-buffers google-protocol-buffer

我可以看到,在Google Chrome(Chromium)中,第一个枚举值(默认值)被声明为"未指定":

optional

https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto

这样做的目的是什么?

考虑到它protobuf 2,因此可以使用requiredunspecified标记字段,只需填写字段即可删除// The format of a URL pattern. enum UrlPatternType { URL_PATTERN_TYPE_UNSPECIFIED = 0; // A pattern without special characters, e.g. "example.com". URL_PATTERN_TYPE_SUBSTRING = 1; // The pattern contains one or more wildcards, namely '*' and/or '^' // characters. The '*' matches any sequence of characters, while the '^' // matches a separator, i.e. anything but a letter, a digit, or one of [-._%]. URL_PATTERN_TYPE_WILDCARDED = 2; // The pattern is a regular expression. URL_PATTERN_TYPE_REGEXP = 3; }; 枚举值可选的。

让我们说: https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto?l=22

optional

但该字段为 optional UrlPatternType url_pattern_type = 6; https://cs.chromium.org/chromium/src/components/url_pattern_index/proto/rules.proto?l=150

unspecified

为什么不传递它而不是传递 <h2 class="title1"></h2><br> <div class="author1"></div><br> <div class="publishedAt1"></div><br> <p class="description1"></p><br> <div class="url1"></div><br> <h2 class="title2"></h2><br> <div class="author2"></div><br> <div class="publishedAt2"></div><br> <p class="description2"></p><br> <div class="url2"></div><br> ``` 值?

1 个答案:

答案 0 :(得分:4)

如果您希望将来转移到proto3,也许最重要的原因是提供一条干净的路径,因为这是唯一可以直接兼容的选项。

然而,它还简化了许多平台的使用,因为不同语言之间的枚举差别很大。它还使默认值非常明显地显示为“可能是错误的” - 再次:默认的新实例如何初始化可能在平台/语言之间变化很大,并且您希望的控制级别在某些平台上可能不可用。