[英]Protocol Buffer use enum
您好,我正在使用 protobuf,但我遇到了問題。
我有一些枚舉函數,但在其中我有相同的別名,當我嘗試為某種語言“go”編譯文件時,編譯器返回錯誤。
我復制了 protobuf 文檔中的示例來定義枚舉,但仍然無法正常工作。
enum EnumAllowingAlias {
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
}
enum EnumNotAllowingAlias {
UNKNOWN = 0;
STARTED = 1;
// RUNNING = 1; // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}
這是谷歌文檔說如果你需要在一些不同的枚舉中使用相同的別名,你需要添加選項“option allow_alias = true;” 在枚舉中,但在嘗試編譯 .proto 文件后,編譯器響應。
example.proto:13:5:“UNKNOWN”已在“命名空間”中定義。
example.proto:13:5:請注意,枚舉值使用 C++ 范圍規則,這意味着枚舉值是其類型的同級,而不是其子級。
因此,“UNKNOWN”在“kluso”中必須是唯一的,而不僅僅是在“EnumNotAllowingAlias”中。example.proto:14:5:“開始”已經在“命名空間”中定義。
example.proto:14:5:請注意,枚舉值使用 C++ 范圍規則,這意味着枚舉值是其類型的同級,而不是其子級。
因此,“STARTED”在“kluso”中必須是唯一的,而不僅僅是在“EnumNotAllowingAlias”中。
我不知道發生了什么。 有人知道是什么問題嗎?
allow_alias 允許您為相同的值使用兩個不同的名稱。
但是,它仍然不允許使用相同的名稱兩次!
在您從文檔中獲取的示例中,他們只是試圖通過將 allow_alias 設置為 true 來演示如何在相同的枚舉類型中使用 STARTED = 1 和 RUNNING = 1 。 他們給出的兩個枚舉示例並不打算在同一個包中使用。
但是,如果您已經在 EnumAllowingAlias 中使用了 RUNNING,則如果它們在同一個包中,則不能在 EnumNotAllowingAlias 中再次使用 RUNNING。
您正在尋找的答案在錯誤消息中 :) 解析它實際告訴您的內容有點困難。
基本上,什么
枚舉值是它們類型的兄弟,而不是它的孩子
意思是,枚舉值的范圍MyEnum.FOO
和MyEnum2.FOO
, MyEnum2.FOO
它們的范圍與MyEnum2.FOO
相同。 所以同一個 .proto 文件中的兩個枚舉值不能具有相同的名稱; 他們都試圖在該文件中作為FOO
存在,而不是MyEnum.FOO
和MyEnum2.FOO
。
我不明白你的意思,因為我有兩個名字不同的枚舉,第一個是 EnumAllowingAlias,第二個是 EnumNotAllowingAlias 這是例子
https://developers.google.com/protocol-buffers/docs/proto#enum
在他們解釋的例子之前
“您可以通過為不同的枚舉常量分配相同的值來定義別名。為此,您需要將 allow_alias 選項設置為 true,否則協議編譯器將在找到別名時生成錯誤消息。”
在這種情況下,我可以創建 2 個這樣的枚舉,編譯器應該首先使用別名創建兩個枚舉,第二個沒有別名,但編譯器在第一個答案中向我發送了錯誤。
EnumAllowingAlias 和 EnumNotAllowingAlias 不能定義在同一個 proto 文件中,它們只是理解 allow_alias 用法的兩個例子。
allow_alias 只在同一個枚舉中工作,正如 mahdt 所說,allow_alias 允許你在一個枚舉中為相同的值使用兩個不同的名稱,EnumAllowingAlias 就是這種情況的例子:
enum EnumAllowingAlias {
option allow_alias = true;
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1;
}
如果 allow_alias 未設置為 true,則 EnumNotAllowingAlias 將收到錯誤:
enum EnumNotAllowingAlias {
UNKNOWN = 0;
STARTED = 1;
RUNNING = 1; // Uncommenting this line will cause a compile error inside Google and a warning message outside.
}
Enum的使用在Java中沒有這個限制,我覺得對於大多數開發者來說真的很困惑,所以我提出了一個錯誤報告: https : //github.com/protocolbuffers/protobuf/issues/5425
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.