Skip to content

Commit

Permalink
Merge pull request #187 from jrycw/fix-typo
Browse files Browse the repository at this point in the history
Fix typo
  • Loading branch information
weihanglo authored Nov 21, 2023
2 parents 394f88d + b403a56 commit 84f95c7
Show file tree
Hide file tree
Showing 13 changed files with 15 additions and 15 deletions.
2 changes: 1 addition & 1 deletion listings/ch19-advanced-features/listing-19-20/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ impl Dog {

impl Animal for Dog {
fn baby_name() -> String {
String::from("小狗崽")
String::from("小狗狗")
}
}

Expand Down
2 changes: 1 addition & 1 deletion listings/ch19-advanced-features/listing-19-21/output.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@ $ cargo run
Compiling traits-example v0.1.0 (file:///projects/traits-example)
Finished dev [unoptimized + debuginfo] target(s) in 0.48s
Running `target/debug/traits-example`
幼犬被稱作小狗崽
幼犬被稱作小狗狗
2 changes: 1 addition & 1 deletion listings/ch19-advanced-features/listing-19-21/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ impl Dog {

impl Animal for Dog {
fn baby_name() -> String {
String::from("小狗崽")
String::from("小狗狗")
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/ch04-02-references-and-borrowing.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ string data on the heap." src="img/trpl04-05.svg" class="center" />

變數 `s` 有效的作用域和任何函式參數的作用域一樣,但當不再使用參考時,參考所指向的數值不會被丟棄,因為我們沒有所有權。當函式使用參考作為參數而非實際數值時,我們不需要回傳數值來還所有權,因為我們不曾擁有過。

我們會稱呼建立參考這樣的動作叫做**借用(borrowing)**。就像現實世界一樣,如果有人擁有每項東西,他可以借用給你。當你使用完後,你就還給他。你並不擁有它。
我們會稱呼建立參考這樣的動作叫做**借用(borrowing)**。就像現實世界一樣,如果有人擁有某項東西,他可以借用給你。當你使用完後,你就還給他。你並不擁有它。

所以要是我們嘗試修改我們借用的東西會如何呢?請試試範例 4-6 的程式碼。直接劇透你:它執行不了的!

Expand Down
2 changes: 1 addition & 1 deletion src/ch08-03-hash-maps.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

<span class="caption">範例 8-21:取得雜湊映射中藍隊的分數</span>

`score` 在此將會是對應藍隊的分數,而且結果會是 `Some(&10)`。結果是使用 `Some` 的原因是因為 `get` 回傳的是 `Option<&V>`。如果雜湊映射中該鍵沒有對應值的話,`get` 就會回傳 `None`。所以程式會需要透過我們在第六章談到的方式處理 `Option`
`score` 在此將會是對應藍隊的分數,而且結果會是 `10`。結果是使用 `Some` 的原因是因為 `get` 回傳的是 `Option<&V>`。如果雜湊映射中該鍵沒有對應值的話,`get` 就會回傳 `None`。所以程式會需要透過我們在第六章談到的方式處理 `Option`

我們也可以使用 `for` 迴圈用類似的方式來遍歷雜湊映射中每個鍵值配對:

Expand Down
6 changes: 3 additions & 3 deletions src/ch10-03-lifetime-syntax.md
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ Rust 編譯器有個**借用檢查器**(borrow checker)會比較作用域來

當要在函式詮釋生命週期時,詮釋會位於函式簽名中,而不是函式本體。就像型別會寫在簽名中一樣,生命週期詮釋會成為函式的一部份。在函式簽名加上生命週期能讓 Rust 編譯器的分析工作變得更輕鬆。如果當函式的詮釋或呼叫的方式出問題時,編譯器錯誤就能限縮到我們的程式碼中指出來。如果都改讓 Rust 編譯器去推到可能的生命週期關係的話,編譯器可能會指到程式碼真正出錯之後的好幾步之後。

當我們向 `longest` 傳入實際參考時,`'a` 實際替代的生命週期為 `x` 作用域與 `y` 作用域重疊得部分。換句話說,泛型生命週期 `'a` 取得的生命週期會等於 `x``y` 的生命週期中較短的。因為我們將回傳的參考詮釋了相同的生命週期參數 `'a`,回傳參考的生命週期也會保證在 `x``y` 的生命週期較短的結束前有效。
當我們向 `longest` 傳入實際參考時,`'a` 實際替代的生命週期為 `x` 作用域與 `y` 作用域重疊的部分。換句話說,泛型生命週期 `'a` 取得的生命週期會等於 `x``y` 的生命週期中較短的。因為我們將回傳的參考詮釋了相同的生命週期參數 `'a`,回傳參考的生命週期也會保證在 `x``y` 的生命週期較短的結束前有效。

讓我們來看看如何透過傳入不同實際生命週期的參考來使生命週期詮釋能約束 `longest` 函式,如範例 10-22 所示。

Expand Down Expand Up @@ -284,7 +284,7 @@ fn longest<'a, 'b>(x: &'a str, y: &'b str) -> &str {

`impl` 區塊中方法簽名的參考可能會與結構體欄位的參考生命週期綁定,或者它們可能是互相獨立的。除此之外,生命週期省略規則常常可以省略方法簽名中的生命週期詮釋。讓我們看看範例 10-24 定義過的 `ImportantExcerpt` 來作為範例。

首先我們使用一個方叫做 `level` 其參數只有 `self` 的參考而回傳值是 `i32`,這不是任何參考:
首先我們使用一個方法叫做 `level` 其參數只有 `self` 的參考而回傳值是 `i32`,這不是任何參考:

```rust
{{#rustdoc_include ../listings/ch10-generic-types-traits-and-lifetimes/no-listing-10-lifetimes-on-methods/src/main.rs:1st}}
Expand Down Expand Up @@ -324,7 +324,7 @@ let s: &'static str = "我有靜態生命週期。";

## 總結

我們在此章節涵蓋了許多內容!現在你已經知道泛型型別參數、特徵與特徵界限以及泛型生命週期參數,你已經準備好能寫出適用於許多不同情況且不重複的程式碼了。泛型型別參數讓你可以讓程式碼適用於不同型別;特徵與特徵界限確保就算型別為泛型,它們都會有相同的行為。你還學到了使用生命週期詮釋確保此如此彈性的程式碼不會造成迷途參考。而且這些分析都發生在編譯期間,完全不影響執行時效能
我們在此章節涵蓋了許多內容!現在你已經知道泛型型別參數、特徵與特徵界限以及泛型生命週期參數,你已經準備好能寫出適用於許多不同情況且不重複的程式碼了。泛型型別參數讓你可以讓程式碼適用於不同型別;特徵與特徵界限確保就算型別為泛型,它們都會有相同的行為。你還學到了使用生命週期詮釋確保此如此彈性的程式碼不會造成迷途參考。而且這些分析都發生在編譯期間,完全不影響執行的效能

不管你信不信,本章節還有很多延伸主題可以導論,像是第十七章就會討論特徵物件(trait objects),這是另一個使用特徵的方法。另外還有一些更複雜的場合會涉及到更進階的生命週期詮釋。對此你可能就會想閱讀 [Rust Reference][reference]。接下來,你將學習如何在 Rust 寫測試,讓你可以確保程式碼能如期執行。

Expand Down
2 changes: 1 addition & 1 deletion src/ch11-01-writing-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ tests::it_adds_two ... ok` 而 `ok` 就代表我們的測試通過了!

### 加入自訂失敗訊息

你可以寫一個一個與失敗訊息一同顯示的自訂訊息,作為 `assert!``assert_eq!``assert_ne!` 巨集的選擇性引數。任何指定在必要引數後方的任何引數都會傳給 `format!` 巨集(我們在第八章[「使用 `+` 運算子或 `format!` 巨集串接字串」][concatenation-with-the--operator-or-the-format-macro]<!-- ignore -->的段落討論過),所以你可以傳入一個包含 `{}` 佔位符(placeholder)的格式化字串以及其對應的數值。自訂訊息可以用來紀錄判定的意義,當測試失敗時,你可以更清楚知道程式碼的問題。
你可以寫一個與失敗訊息一同顯示的自訂訊息,作為 `assert!``assert_eq!``assert_ne!` 巨集的選擇性引數。任何指定在必要引數後方的任何引數都會傳給 `format!` 巨集(我們在第八章[「使用 `+` 運算子或 `format!` 巨集串接字串」][concatenation-with-the--operator-or-the-format-macro]<!-- ignore -->的段落討論過),所以你可以傳入一個包含 `{}` 佔位符(placeholder)的格式化字串以及其對應的數值。自訂訊息可以用來紀錄判定的意義,當測試失敗時,你可以更清楚知道程式碼的問題。

舉例來說,假設我們有個函式會以收到的名字向人們打招呼,而且我們希望測試我們傳入的名字有出現在輸出:

Expand Down
2 changes: 1 addition & 1 deletion src/ch11-02-running-tests.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 控制程式如何執行

就像 `cargo run` 會編譯你的程式碼並執行產生的執行檔,`cargo test` 會在測試模式編譯你的程式碼並執行產生的測試執行檔。`cargo test` 產生的執行檔預設行為會平行執行所有測試,並獲取測試執行時的輸出,讓測試各自的輸出結果不會顯示出來,以更容易讀取相關測試的結果。然而你可以指定命令列選項來改變預設行為。
就像 `cargo run` 會編譯你的程式碼並執行產生的執行檔,`cargo test` 會在測試模式編譯你的程式碼並執行產生的測試執行檔。`cargo test` 產生的執行檔預設行為會平行執行所有測試,並獲取測試執行時的輸出,讓測試各自的輸出結果不會顯示出來,以更容易讀取相關測試的結果。然而你可以指定命令列選項來改變預設行為。

有些命令列選項用於 `cargo test` 而有些則用於產生的測試執行檔。要分開這兩種引數,你可以先列出要用於 `cargo test` 的引數然後加上 `--` 分隔線來區隔要用於測試執行檔的引數。執行 `cargo test --help` 可以顯示你能用在 `cargo test` 的選項,而執行 `cargo test -- --help` 則會顯示你在 `--` 之後能用的選項。

Expand Down
2 changes: 1 addition & 1 deletion src/ch14-02-publishing-to-crates-io.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; fini

公開 API 的架構是發佈 crate 時要考量到的一大重點。使用 crate 的人可能並沒有你那麼熟悉其中的架構,而且如果你的 crate 模組分層越深的話,他們可能就難以找到他們想使用的部分。

在第七章中,我們介紹了如何使用 `mod` 關鍵字來組織我們的程式碼成模組、如何使用 `pub` 關鍵字來公開項目,以及如何使用 `use` 關鍵字在將項目引入作用域。然而在開發 crate 時的架構雖然對你來說是合理的,但對你的使用者來說可能就不是那麼合適了。你可能會希望用有數個層級的分層架構來組織你的程式碼,但是要是有人想使用你定義在分層架構裡的型別時,它們可能就很難發現這些型別的存在。而且輸入 `use my_crate::some_module::another_module::UsefulType;` 是非常惱人的,我們會希望輸入 `use my_crate::UsefulType;` 就好。
在第七章中,我們介紹了如何使用 `mod` 關鍵字來組織我們的程式碼成模組、如何使用 `pub` 關鍵字來公開項目,以及如何使用 `use` 關鍵字來將項目引入作用域。然而在開發 crate 時的架構雖然對你來說是合理的,但對你的使用者來說可能就不是那麼合適了。你可能會希望用有數個層級的分層架構來組織你的程式碼,但是要是有人想使用你定義在分層架構裡的型別時,它們可能就很難發現這些型別的存在。而且輸入 `use my_crate::some_module::another_module::UsefulType;` 是非常惱人的,我們會希望輸入 `use my_crate::UsefulType;` 就好。

好消息是如果你的架構**不便於**其他函式庫所使用的話,你不必重新組織你的內部架構:你可以透過使用 `pub use`選擇重新匯出(re-export)項目來建立一個不同於內部私有架構的公開架構。重新匯出會先取得某處的公開項目,再從其他地方使其公開,讓它像是被定義在其他地方一樣。

Expand Down
2 changes: 1 addition & 1 deletion src/ch15-06-reference-cycles.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ children: RefCell { value: [] } }] } })

如果我們嘗試在作用域結束後取得 `leaf` 的父節點,我們會再次獲得 `None`。在程式的最後,`leaf``Rc<Node>` 強計數為 1 且弱計數為 0,因為變數 `leaf` 現在是 `Rc<Node>` 唯一的參考。

所有管理計數與數值釋放都已經實作在 `Rc<T>``Weak<T>`,它們都有 `Drop` 特的實作。在 `Node` 的定義中指定子節點對父節點的關係應為 `Weak<T>` 參考,讓你能夠將父節點與子節點彼此關聯,且不必擔心產生參考循環與記憶體泄漏。
所有管理計數與數值釋放都已經實作在 `Rc<T>``Weak<T>`,它們都有 `Drop` 特徵的實作。在 `Node` 的定義中指定子節點對父節點的關係應為 `Weak<T>` 參考,讓你能夠將父節點與子節點彼此關聯,且不必擔心產生參考循環與記憶體泄漏。

## 總結

Expand Down
2 changes: 1 addition & 1 deletion src/ch17-03-oo-design-patterns.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
## 實作物件導向設計模式

**狀態模式**(state pattern)是種物件導向設計模式。此模式的關鍵在於我們會定義一個數值擁有些內部狀態,以**狀態物件**(state objects)呈現,然後數值的行為會依據內部狀態而有所改變。我們將向用一個部落格文章結構體作為範例,讓它持有個狀態能在「草稿」、「審核」、「發佈」間轉換,成為狀態物件。
**狀態模式**(state pattern)是種物件導向設計模式。此模式的關鍵在於我們會定義一個數值擁有些內部狀態,以**狀態物件**(state objects)呈現,然後數值的行為會依據內部狀態而有所改變。我們將用一個部落格文章結構體作為範例,讓它持有個狀態能在「草稿」、「審核」、「發佈」間轉換,成為狀態物件。

狀態物件會分享功能,當然在 Rust 中我們使用結構體與特徵,而不是使用物件與繼承。每個狀態物件負責本身的行為並監測何時要改變成其他狀態。持有狀態物件的數值不會知道狀態中不同的行為,或是何時要轉換狀態。

Expand Down
2 changes: 1 addition & 1 deletion src/ch19-02-advanced-traits.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ Rust 並沒有限制不同特徵之間不能有同名的方法,也沒有阻止

<span class="caption">範例 19-19: 一個特徵和一個型別分別擁有同名關聯函式,並且該型別實作了該特徵</span>

我們在 `Dog` 中的 `baby_name` 關聯函式實作了一段程式碼,將所有小狗狗命名為小不點。這個 `Dog` 型別同時實作了 `Animal` 特徵,`Animal` 特徵則描述了所有動物都有的習性。在實作了 `Animal` 特徵的 `Dog` 上,透過與 `Animal` 特徵關聯的 `baby_name` 函式中,表達了幼犬被稱作小狗狗這一概念。
我們在 `Dog` 中的 `baby_name` 關聯函式實作了一段程式碼,將所有小狗狗命名為小不點。這個 `Dog` 型別同時實作了 `Animal` 特徵,`Animal` 特徵則描述了所有動物都有的習性。在實作了 `Animal` 特徵的 `Dog` 上,透過與 `Animal` 特徵關聯的 `baby_name` 函式中,表達了幼犬被稱作小狗狗這一概念。

`main` 中我們呼叫 `Dog::baby_name` 函式,最終會直接呼叫 `Dog` 上的關聯函式。這段程式碼會印出:

Expand Down
2 changes: 1 addition & 1 deletion src/ch19-05-macros.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ let v: Vec<u32> = vec![1, 2, 3];

`$()` 後的逗號代表字面上的逗號分隔,可以選擇性地在匹配 `$()` 內的程式碼後出現。而 `*` 這指明,這個模式可以匹配零至多個在 `*` 之前的東西。

當我們的以 `vec![1, 2, 3]` 呼叫這個巨集,`$x` 模式會匹配到三次,分別為 `1``2``3` 三個表達式。
當我們以 `vec![1, 2, 3]` 呼叫這個巨集,`$x` 模式會匹配到三次,分別為 `1``2``3` 三個表達式。

現在來看看這個模式分支的本體程式碼:在 `$()*` 內的 `temp_vec.push()` 會根據 `$()` 模式匹配了幾次而產生幾次。這個 `$x` 會被每個匹配的表達式取代。當我們使用 `vec![1, 2, 3]` 呼叫巨集時,這個取代巨集呼叫而產生出來的程式碼會是:

Expand Down

0 comments on commit 84f95c7

Please sign in to comment.