當呼叫模組的函式時,需要指定完整的路徑。
通過下面一個例子來理解這個概念:
pub mod a
{
pub mod b
{
pub mod c
{
pub fn nested_modules()
{
println!("Nested Modules");
}
}
}
}
fn main()
{
a::b::c::nested_modules();
}
執行上面範例程式碼,得到以下結果 -
Nested Modules
在上面的例子中,通過指定完整路徑來呼叫nested_modules()
函式,即,a::b::c::nested_modules()
。
在上面的場景中,看到函式呼叫非常冗長。 Rust中的use
關鍵字縮短了呼叫函式的長度,使函式的模組在範圍內。 use
關鍵字只在範圍中指定的那些模組。 通過下面一個例子來理解這一點:
pub mod a
{
pub mod b
{
pub mod c
{
pub fn nested_modules()
{
println!("Nested Modules");
}
}
}
}
use a::b::c::nested_modules;
fn main()
{
nested_modules();
}
執行上面範例程式碼,得到以下結果 -
Nested Modules
在上面的範例中,use
關鍵字包括範圍內的所有模組。 因此,可以直接呼叫函式,而不必在呼叫函式中包含模組。
列舉也是模組之類的名稱空間的一種形式。 因此,可以使用use
關鍵字將列舉變體帶入範圍。 在use
語句中,可以列出大括號中的列舉變體和最後位置的逗號。
通過下面一個例子來理解:
#[derive(Debug)]
enum Flagcolor
{
Orange,
White,
Green,
}
use Flagcolor::{Orange,White,Green};
fn main()
{
let _o= Orange;
let _w= White;
let _g= Green;
println!("{:?}",_o);
println!("{:?}",_w);
println!("{:?}",_g);
}
執行上面範例程式碼,得到以下結果:
orange
white
green
在上面的範例中,Flagcolor
是一個名稱空間,其變體在use
語句中指定。 因此,可以直接使用列舉變體而不使用列舉名稱和名稱空間說明符。
*
運算子用於將所有專案放入範圍,這也稱為glob
運算子。 如果使用glob
運算子,那麼不需要單獨指定列舉變數。
通過下面一個例子來理解這一點:
#[derive(Debug)]
enum Color
{
Red,
Yellow,
Green,
Orange,
}
use Color::*;
fn main()
{
let _red=Red;
let _yellow=Yellow;
let _green=Green;
let _orange=Orange;
println!("{:?}",_red);
println!("{:?}",_yellow);
println!("{:?}",_green);
println!("{:?}",_orange);
}
執行上面範例程式碼,得到以下結果 -
Red
Yellow
Green
Orange
在上面的範例中,*
運算子已用於包含所有列舉變體,而無需在use
語句中指定列表。
super
關鍵字用於從當前模組存取父模組,它使能夠存取父模組的私有功能。
mod a{
fn x() -> u8 {
5
}
pub mod example {
use super::x;
pub fn foo() {
println!("{}",x());
}
}
}
fn main()
{
a::example::foo();
}
輸出結果如下 -
2
在上面的範例中,模組範例使用了參照其父模組的super
。 由於這個原因,模組範例的foo()
函式可以存取模組a
的私有函式。