美文网首页Rust语言程序员
Rust 从基础到实践(10) 模块

Rust 从基础到实践(10) 模块

作者: zidea | 来源:发表于2019-04-06 09:46 被阅读16次
    rust_logo.jpg

    项目要想做到就得有模块化,今天看 Rust 如何进行模块化。定义模块使用mod关键字来声明模块,下面定义了 A 、B 和 C 三个模块,B 是嵌套在 A 中,这些模块中都提供了 a 和 b 方法。

    mod A{
        fn a(){}
        fn b(){}
        mod B {
            fn a(){}
            fn b(){}
        }
    }
    
    mod C{
        fn a(){}
        fn b(){}
    }
    
    fn main(){
        A::b();
    }
    

    这样调用模块 A 中 b 方法,编译时候提示 b 是一个私有函数。

    mod A{
        pub fn a(){}
        pub fn b(){}
        mod B {
            fn a(){}
            fn b(){}
        }
    }
    

    我们需要在 b 前面添加 pub 表示在模块 A 外通过 A::b() 是可以调用到这个方法的。

    fn main(){
        A::b();
        A::B::a()
    }
    

    因为模块 B 在模块 A 中我们也需要将其定义为 pub 这样外面才能调用到。

    error[E0603]: module `B` is private
      --> src/main.rs:17:8
       |
    17 |     A::B::a()
       |    
    

    这样修改后我们 main 中就可以访问到 A::B::b() 方法了。

    mod A{
        pub fn a(){}
        pub fn b(){}
        pub mod B {
            pub fn a(){}
            pub fn b(){}
        }
    }
    
    

    现在我们虽然通过模块对项目进行划分为 A B 和 C 模块。但是在实际开发过程中我们是不能将所有模块都写入一个文件。

    屏幕快照 2019-04-06 上午9.27.26.png

    我们需要通过文件和目录的形式来管理我们的项目模块节点

    • 定义文件夹 A 作为 A 模块
    • 外层定义 C.rs 做 C 模块
      下面我们分别看看这些文件中包含哪些具体的内容

    B.rs

    pub fn a(){}
    pub fn b(){}
    

    A/mod.rs

    这里值得注意我们在 A 文件夹(相当于定义模块A)需要定义 mod.rs 作为模块 A 的入口文件。这里定义名称是有要求的,需要定义为 mod.rs。

    pub mod B;
    pub fn a(){}
    pub fn b(){}
    

    C.rs

    pub fn a(){}
    pub fn b(){}
    

    main.rs

    fn main(){
        A::b();
        A::B::a();
    }
    
    americancaptain3_20160428193042_09.jpg
    pub mod a {
        pub mod b{
            pub mod c{
                pub mod d{
                    pub fn e(){
                        
                    }
                }
            }
        }
    }
    fn main(){
       a::b::c::d::e();
    }
    

    这样层层嵌套,实在是麻烦。当然有简便方法

    use a::b::c::d;
    fn main(){
       d::e();
    }
    

    枚举也是有命名空间,同样可以 use 定义来节省写代码的量。

    enum Ex {
        A,
        B,
        C,
    }
    use Ex::{A,C};
    fn main(){
       d::e();
       A
    }
    

    这里同样支持通配符

    use Ex::*
    
    th.jpeg

    相关文章

      网友评论

        本文标题:Rust 从基础到实践(10) 模块

        本文链接:https://www.haomeiwen.com/subject/zsrkbqtx.html