Rust 將模塊拆分成多個文件

2023-03-22 15:10 更新
ch07-05-separating-modules-into-different-files.md
commit d5584fb1efeaf8aadfc7caf516df7f1ca0820ceb

到目前為止,本章所有的例子都在一個文件中定義多個模塊。當模塊變得更大時,你可能想要將它們的定義移動到單獨的文件中,從而使代碼更容易閱讀。

例如,我們從示例 7-17 開始,將 front_of_house 模塊移動到屬于它自己的文件 src/front_of_house.rs 中,通過改變 crate 根文件,使其包含示例 7-21 所示的代碼。在這個例子中,crate 根文件是 src/lib.rs,這也同樣適用于以 src/main.rs 為 crate 根文件的二進制 crate 項。

文件名: src/lib.rs

mod front_of_house;

pub use crate::front_of_house::hosting;

pub fn eat_at_restaurant() {
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
    hosting::add_to_waitlist();
}

示例 7-21: 聲明 front_of_house 模塊,其內(nèi)容將位于 src/front_of_house.rs

src/front_of_house.rs 會獲取 front_of_house 模塊的定義內(nèi)容,如示例 7-22 所示。

文件名: src/front_of_house.rs

pub mod hosting {
    pub fn add_to_waitlist() {}
}

示例 7-22: 在 src/front_of_house.rs 中定義 ?front_of_house ?模塊

在 mod front_of_house 后使用分號,而不是代碼塊,這將告訴 Rust 在另一個與模塊同名的文件中加載模塊的內(nèi)容。繼續(xù)重構(gòu)我們例子,將 hosting 模塊也提取到其自己的文件中,僅對 src/front_of_house.rs 包含 hosting 模塊的聲明進行修改:

文件名: src/front_of_house.rs

pub mod hosting;

接著我們創(chuàng)建一個 src/front_of_house 目錄和一個包含 hosting 模塊定義的 src/front_of_house/hosting.rs 文件:

文件名: src/front_of_house/hosting.rs

pub fn add_to_waitlist() {}

模塊樹依然保持相同,eat_at_restaurant 中的函數(shù)調(diào)用也無需修改繼續(xù)保持有效,即便其定義存在于不同的文件中。這個技巧讓你可以在模塊代碼增長時,將它們移動到新文件中。

注意,src/lib.rs 中的 pub use crate::front_of_house::hosting 語句是沒有改變的,在文件作為 crate 的一部分而編譯時,use 不會有任何影響。mod 關(guān)鍵字聲明了模塊,Rust 會在與模塊同名的文件中查找模塊的代碼。

總結(jié)

Rust 提供了將包分成多個 crate,將 crate 分成模塊,以及通過指定絕對或相對路徑從一個模塊引用另一個模塊中定義的項的方式。你可以通過使用 use 語句將路徑引入作用域,這樣在多次使用時可以使用更短的路徑。模塊定義的代碼默認是私有的,不過可以選擇增加 pub 關(guān)鍵字使其定義變?yōu)楣小?

接下來,讓我們看看一些標準庫提供的集合數(shù)據(jù)類型,你可以利用它們編寫出漂亮整潔的代碼。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號