1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2025-03-05 08:25:26 +02:00

zh-TW: translate enums (#865)

* zh-TW: translate enums

Part of #684.

* Apply suggestions from code review

Co-authored-by: Jonathan Hao <phao@google.com>

---------

Co-authored-by: Jonathan Hao <phao@google.com>
This commit is contained in:
Martin Geisler 2023-07-24 17:56:59 +02:00 committed by GitHub
parent 0a09079198
commit 34acff339d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -5529,13 +5529,13 @@ msgstr ""
#: src/enums.md:1
msgid "# Enums"
msgstr ""
msgstr "# 列舉"
#: src/enums.md:3
msgid ""
"The `enum` keyword allows the creation of a type which has a few\n"
"different variants:"
msgstr ""
msgstr "`enum` 關鍵字可建立具有幾個不同變體的型別:"
#: src/enums.md:6
msgid ""
@ -5565,6 +5565,31 @@ msgid ""
"}\n"
"```"
msgstr ""
"```rust,editable\n"
"fn generate_random_number() -> i32 {\n"
" // Implementation based on https://xkcd.com/221/\n"
" 4 // Chosen by fair dice roll. Guaranteed to be random.\n"
"}\n"
"\n"
"#[derive(Debug)]\n"
"enum CoinFlip {\n"
" Heads,\n"
" Tails,\n"
"}\n"
"\n"
"fn flip_coin() -> CoinFlip {\n"
" let random_number = generate_random_number();\n"
" if random_number % 2 == 0 {\n"
" return CoinFlip::Heads;\n"
" } else {\n"
" return CoinFlip::Tails;\n"
" }\n"
"}\n"
"\n"
"fn main() {\n"
" println!(\"You got: {:?}\", flip_coin());\n"
"}\n"
"```"
#: src/enums.md:36
msgid ""
@ -5579,10 +5604,19 @@ msgid ""
"structs but then they wouldn’t be the same type as they would if they were "
"all defined in an enum. "
msgstr ""
"* 列舉可讓您在單一類別中收集一組值。\n"
"* 本頁面提供列舉類別 `CoinFlip`,以及 `Heads` 和 `Tail` 這兩個變體。您可以在"
"使用變體時記下命名空間。\n"
"* 這或許是比較結構體和列舉的好時機:\n"
" * 無論使用何者,都能取得沒有欄位的簡易版本 (單元結構體),或是具有不同欄位型"
"別的版本 (變體負載)。\n"
" * 無論使用何者,相關函式都會在 `impl` 區塊中定義。\n"
" * 您甚至可以使用獨立的結構體實作列舉的不同變體,但比起在列舉中定義全部變體"
"的情況,這麼做會讓變體的型別有所不同。"
#: src/enums/variant-payloads.md:1
msgid "# Variant Payloads"
msgstr ""
msgstr "# 變體負載"
#: src/enums/variant-payloads.md:3
msgid ""
@ -5590,6 +5624,8 @@ msgid ""
"the\n"
"`match` statement to extract the data from each variant:"
msgstr ""
"您可以定義更豐富的列舉,讓列舉的變體攜帶資料。接著,您可以使用 `match` 陳述"
"式,從各個變體擷取資料:"
#: src/enums/variant-payloads.md:6
msgid ""
@ -5620,6 +5656,32 @@ msgid ""
"}\n"
"```"
msgstr ""
"```rust,editable\n"
"enum WebEvent {\n"
" PageLoad, // Variant without payload\n"
" KeyPress(char), // Tuple struct variant\n"
" Click { x: i64, y: i64 }, // Full struct variant\n"
"}\n"
"\n"
"#[rustfmt::skip]\n"
"fn inspect(event: WebEvent) {\n"
" match event {\n"
" WebEvent::PageLoad => println!(\"page loaded\"),\n"
" WebEvent::KeyPress(c) => println!(\"pressed '{c}'\"),\n"
" WebEvent::Click { x, y } => println!(\"clicked at x={x}, y={y}\"),\n"
" }\n"
"}\n"
"\n"
"fn main() {\n"
" let load = WebEvent::PageLoad;\n"
" let press = WebEvent::KeyPress('x');\n"
" let click = WebEvent::Click { x: 20, y: 80 };\n"
"\n"
" inspect(load);\n"
" inspect(press);\n"
" inspect(click);\n"
"}\n"
"```"
#: src/enums/variant-payloads.md:35
msgid ""
@ -5645,16 +5707,32 @@ msgid ""
"cannot implement traits, for example. \n"
" "
msgstr ""
"* 只有在與模式配對相符後,才能存取列舉變數中的值。此模式會將參照繫結至 `=>` "
"後方「配對分支」中的欄位。\n"
" * 系統會從上到下將運算式與模式進行配對。在 Rust 中,不會像在 C 或 C++ 中一"
"樣出現貫穿 (fall-through) 情形。\n"
" * 配對運算式具有值。此值是系統執行的配對分支中的最後一個運算式。\n"
" * 我們會從上方開始尋找符合該值的模式,然後執行箭頭後方的程式碼。一旦發現相"
"符項目,就會停止。\n"
"* 請示範非窮舉搜尋的情況。請確認系統處理所有案例的時間,指出 Rust 編譯器提供"
"的優勢。\n"
"* `match` 會檢查 `enum` 中隱藏的判別值欄位。\n"
"* 只要呼叫 `std::mem::discriminant()`,就有可能擷取該判別值。`\n"
" * 舉例來說,如果在為結構體實作 `PartialEq` 時,比較欄位值不會對相等性造成影"
"響,這種做法就很實用。\n"
"* `WebEvent::Click { ... }` 與具有頂層 `struct Click { ... }` 的 `WebEvent::"
"Click(Click)` 並非完全相同。舉例來說,內嵌版本無法實作特徵。\n"
" "
#: src/enums/sizes.md:1
msgid "# Enum Sizes"
msgstr ""
msgstr "# 列舉大小"
#: src/enums/sizes.md:3
msgid ""
"Rust enums are packed tightly, taking constraints due to alignment into "
"account:"
msgstr ""
msgstr "Rust 列舉會緊密封裝,並考量因對齊而造成的限制:"
#: src/enums/sizes.md:5
msgid ""
@ -5678,12 +5756,33 @@ msgid ""
"}\n"
"```"
msgstr ""
"```rust,editable\n"
"use std::mem::{align_of, size_of};\n"
"\n"
"macro_rules! dbg_size {\n"
" ($t:ty) => {\n"
" println!(\"{}: size {} bytes, align: {} bytes\",\n"
" stringify!($t), size_of::<$t>(), align_of::<$t>());\n"
" };\n"
"}\n"
"\n"
"enum Foo {\n"
" A,\n"
" B,\n"
"}\n"
"\n"
"fn main() {\n"
" dbg_size!(Foo);\n"
"}\n"
"```"
#: src/enums/sizes.md:25
msgid ""
"* See the [Rust Reference](https://doc.rust-lang.org/reference/type-layout."
"html)."
msgstr ""
"* 請參閱 [Rust 參考資料](https://doc.rust-lang.org/reference/type-layout."
"html)。"
#: src/enums/sizes.md:31
msgid ""
@ -5828,6 +5927,137 @@ msgid ""
" }\n"
" ```"
msgstr ""
" * 在內部,Rust 會使用欄位 (判別值) 追蹤列舉變體。\n"
"\n"
" * 您可以視需要控制判別值,例如為了與 C 相容:\n"
" \n"
" ```rust,editable\n"
" #[repr(u32)]\n"
" enum Bar {\n"
" A, // 0\n"
" B = 10000,\n"
" C, // 10001\n"
" }\n"
" \n"
" fn main() {\n"
" println!(\"A: {}\", Bar::A as u32);\n"
" println!(\"B: {}\", Bar::B as u32);\n"
" println!(\"C: {}\", Bar::C as u32);\n"
" }\n"
" ```\n"
"\n"
" 如果沒有 `repr`,判別值型別會需要 2 個位元組,因為 10001 適合 2 個位元"
"組。\n"
"\n"
"\n"
" * 請嘗試其他型別,例如以下項目:\n"
" \n"
" * `dbg_size!(bool)`:大小為 1 個位元組,對齊:1 個位元組。\n"
" * `dbg_size!(Option<bool>)`:大小為 1 個位元組,對齊:1 個位元組 (區位最佳"
"化,請見下文)。\n"
" * `dbg_size!(&i32)`:大小為 8 個位元組,對齊:8 個位元組 (在 64 位元機器"
"上)。\n"
" * `dbg_size!(Option<&i32>)`:大小為 8 個位元組,對齊:8 個位元組 (空值指"
"標最佳化,請見下文)。\n"
"\n"
" * 區位最佳化:Rust 會為列舉判別值合併未使用的位元模式。\n"
"\n"
" * 空值指標最佳化:針對[部分型別](https://doc.rust-lang.org/std/option/"
"#representation),Rust 保證 `size_of::<T>()` 等於 `size_of::<Option<T>>()`.\n"
"\n"
" 如果想示範位元表示法實際運作時「可能」的樣子,可以使用下列範例程式碼。"
"請務必注意,編譯器並無對這個表示法提供保證,因此這完全不安全。\n"
"\n"
" ```rust,editable\n"
" use std::mem::transmute;\n"
"\n"
" macro_rules! dbg_bits {\n"
" ($e:expr, $bit_type:ty) => {\n"
" println!(\"- {}: {:#x}\", stringify!($e), transmute::<_, "
"$bit_type>($e));\n"
" };\n"
" }\n"
"\n"
" fn main() {\n"
" // TOTALLY UNSAFE. Rust provides no guarantees about the bitwise\n"
" // representation of types.\n"
" unsafe {\n"
" println!(\"Bitwise representation of bool\");\n"
" dbg_bits!(false, u8);\n"
" dbg_bits!(true, u8);\n"
"\n"
" println!(\"Bitwise representation of Option<bool>\");\n"
" dbg_bits!(None::<bool>, u8);\n"
" dbg_bits!(Some(false), u8);\n"
" dbg_bits!(Some(true), u8);\n"
"\n"
" println!(\"Bitwise representation of Option<Option<bool>>\");\n"
" dbg_bits!(Some(Some(false)), u8);\n"
" dbg_bits!(Some(Some(true)), u8);\n"
" dbg_bits!(Some(None::<bool>), u8);\n"
" dbg_bits!(None::<Option<bool>>, u8);\n"
"\n"
" println!(\"Bitwise representation of Option<&i32>\");\n"
" dbg_bits!(None::<&i32>, usize);\n"
" dbg_bits!(Some(&0i32), usize);\n"
" }\n"
" }\n"
" ```\n"
"\n"
" 如果想討論將超過 256 個 `Option` 鏈結在一起的情況,可以使用下列更複雜的"
"範例。\n"
"\n"
" ```rust,editable\n"
" #![recursion_limit = \"1000\"]\n"
"\n"
" use std::mem::transmute;\n"
" \n"
" macro_rules! dbg_bits {\n"
" ($e:expr, $bit_type:ty) => {\n"
" println!(\"- {}: {:#x}\", stringify!($e), transmute::<_, "
"$bit_type>($e));\n"
" };\n"
" }\n"
"\n"
" // 在 2^n Some() 中包裝值的巨集,n 為「@」符號的數字。\n"
" // 評估此巨集時,必須提高遞迴限制。\n"
" macro_rules! many_options {\n"
" ($value:expr) => { Some($value) };\n"
" ($value:expr, @) => {\n"
" Some(Some($value))\n"
" };\n"
" ($value:expr, @ $($more:tt)+) => {\n"
" many_options!(many_options!($value, $($more)+), $($more)+)\n"
" };\n"
" }\n"
"\n"
" fn main() {\n"
" // TOTALLY UNSAFE. Rust provides no guarantees about the bitwise\n"
" // representation of types.\n"
" unsafe {\n"
" assert_eq!(many_options!(false), Some(false));\n"
" assert_eq!(many_options!(false, @), Some(Some(false)));\n"
" assert_eq!(many_options!(false, @@), "
"Some(Some(Some(Some(false)))));\n"
"\n"
" println!(\"Bitwise representation of a chain of 128 Option's."
"\");\n"
" dbg_bits!(many_options!(false, @@@@@@@), u8);\n"
" dbg_bits!(many_options!(true, @@@@@@@), u8);\n"
"\n"
" println!(\"Bitwise representation of a chain of 256 Option's."
"\");\n"
" dbg_bits!(many_options!(false, @@@@@@@@), u16);\n"
" dbg_bits!(many_options!(true, @@@@@@@@), u16);\n"
"\n"
" println!(\"Bitwise representation of a chain of 257 Option's."
"\");\n"
" dbg_bits!(many_options!(Some(false), @@@@@@@@), u16);\n"
" dbg_bits!(many_options!(Some(true), @@@@@@@@), u16);\n"
" dbg_bits!(many_options!(None::<bool>, @@@@@@@@), u16);\n"
" }\n"
" }\n"
" ```"
#: src/methods.md:3
msgid ""