5. 模塊
5.1 模塊定義
在一個(gè)project中壮韭,模塊的入口為src/lib.rs。模塊的聲明以mod
關(guān)鍵字開(kāi)頭。項(xiàng)目的根模塊必須在lib.rs中進(jìn)行聲明刚操。
模塊聲明遵循如下遞歸規(guī)則:
- 如果一個(gè)叫做 foo 的模塊沒(méi)有子模塊,應(yīng)該將 foo 的聲明放入叫做 foo.rs 的文件中再芋。
- 如果一個(gè)叫做 foo 的模塊有子模塊菊霜,應(yīng)該將 foo 的聲明放入叫做 foo/mod.rs 的文件中。
5.2 模塊實(shí)現(xiàn)
模塊的實(shí)現(xiàn)與聲明可以在一起济赎,即mod
關(guān)鍵字后跟一個(gè)代碼塊鉴逞,內(nèi)置函數(shù)定義:
//src/lib.rs or src/some_mod.rs or src/some_mod/mod.rs
mod mod1{
fn func(){
//do something
}
}
模塊的實(shí)現(xiàn)也可以與模塊的聲明分離,使用mod
關(guān)鍵字在 src/lib.rs 文件 或者子模塊的 mod.rs 文件中聲明模塊司训,然后將實(shí)現(xiàn)放入模塊的實(shí)現(xiàn)文件中构捡。如果沒(méi)有子模塊,則模塊實(shí)現(xiàn)的文件名與模塊名一致:
// 聲明
// src/lib.rs or src/some_mod/mod.rs
mod mod2;
// 實(shí)現(xiàn)
//src/mod2.rs or src/some_mod/mod2.rs
fn func(){
//do something
}
5.3 即便在項(xiàng)目的子模塊中使用外部 crate壳猜,extern crate
也應(yīng)該位于根模塊(也就是 src/main.rs 或 src/lib.rs)勾徽。接著,在子模塊中统扳,我們就可以像頂層模塊那樣引用外部 crate 中的項(xiàng)了喘帚。
5.4 可見(jiàn)性。一個(gè)模塊如果是公有的咒钟,且模塊中函數(shù)是公有的啥辨,則該函數(shù)可以被外部調(diào)用《㈦纾可見(jiàn)性規(guī)則:
如果一個(gè)項(xiàng)是公有的溉知,它能被任何父模塊訪問(wèn)
如果一個(gè)項(xiàng)是私有的,它能被其直接父模塊及其任何子模塊訪問(wèn)
所謂直接父模塊,指的是該項(xiàng)的定義所在的模塊级乍。
5.4 使用use
語(yǔ)句可以將某個(gè)命名空間里的名稱引入當(dāng)前作用域:
mod a {
pub mod b {
pub mod c{
pub fn d () {}
}
}
}
// use 將名字引入作用域
fn test_concrete(){
use a::b::c;
c::d();
}
//使用*表示引入命名空間下所有名字
fn test_glob() {
use a::b::c::*;
d();
}
enum TestEnum{
A,
B,
}
//枚舉也是命名空間舌劳,可以用use引入指定的名字
//可以在 :: 符號(hào)后面跟上 {} 來(lái)從同一個(gè)命名空間引入多個(gè)名字
fn test_enum{
use TestEnum::{A,B};
}
5.5 默認(rèn)情況下,模塊搜索的起始路徑為當(dāng)前模塊玫荣。使用::
開(kāi)頭搜索模塊甚淡,代表從根路徑開(kāi)始搜尋模塊。使用super
來(lái)尋找模塊捅厂,則代表從當(dāng)前模塊的上一層開(kāi)始搜尋贯卦。