簡體   English   中英

協議緩沖區使用枚舉

[英]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.FOOMyEnum2.FOOMyEnum2.FOO它們的范圍與MyEnum2.FOO相同 所以同一個 .proto 文件中的兩個枚舉值不能具有相同的名稱; 他們都試圖在該文件中作為FOO存在,而不是MyEnum.FOOMyEnum2.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM