當調用模組的函數時,需要指定完整的路徑。
通過下麵一個例子來理解這個概念:
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()
。
use關鍵字
在上面的場景中,看到函數調用非常冗長。 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 關鍵字
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
的私有函數。