rust05模块

库(crate)

Rust中有四种库(crate):core crate(核心库)、std crate(标准库)、binary crate(二进制库)、extern crate(外部库),其中核心库的代码提供了很多特殊的方法让我们编写代码时无需显式导入就可以直接使用例如: println!、Some、enum、str、fn、impl等; 标准库和外部库代码是需要自行导入才能使用,它们两的区别是标准库由语言本身自带(由rust官方团队来维护),而外部库库是一个外部公共库(由开发者们来自己维护).

Rust中创建一个模块需要使用Cargo来完成;与之前利用Cargo来创建一个二进制项目代码(cargo new --bin PROJECT_NAME)所需提供的参数不同; Cargo默认情况下创建的并不是二进制项目代码,而是外部库(cargo new CRATE_NAME)。

 
 

创建一个外部库

# 创建一个二进制库
[zhengtong@localhost ~]$ cargo new --bin learn_rust
[zhengtong@localhost ~]$ cd learn_rust

# 创建一个外部库
[zhengtong@localhost learn_rust]$ cargo new communicator

# 目录结构
[zhengtong@localhost learn_rust]$ tree ../learn_rust
../learn_rust/
├── Cargo.toml
├── communicator
│   ├── Cargo.toml
│   └── src
│       └── lib.rs
├── src
│   └── main.rs

# 查看样例代码
[zhengtong@localhost learn_rust]$ cat communicator/src/lib.rs 
#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}

上面这个代码片段创建了一个二进制库(learn_rust)和一个外部库(communicator)。

binary crate:src/main.rs
extern crate:src/lib.rs

rust只允许binary crate 代码入口在src/main.rs中,
rust只允许extern crate 代码入口在src/lib.rs中.

 
 

定义一个模块

备注:Rust允许函数块中不填写任何代码。

[zhengtong@localhost learn_rust]$ vim communicator/src/lib.rs 
#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}

mod network {   // 模块: 不需要圆括号

    mod server {
        fn start() {
        }
        
        fn receive() {
        }
        
        fn send() {
        }
    }
    
    mod client {
        fn connect() {
        }
        
        fn send() {
        }
        
        fn receive() {
        }
    }
    
}

 
 

公开模块

Rust中所有模块默认都是私有的,需要指定pub之后才能被外部调用.

[zhengtong@localhost learn_rust]$ vim communicator/src/lib.rs 
#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}

pub mod network {           // 公开模块

    pub mod server {        // 公开模块

        pub fn start() {    // 公开函数
            println!("start the server!")
        }

        pub fn receive() {  // 公开函数
            println!("receive data")
        }

        pub fn send() {     // 公开函数
            println!("send data back to client")
        }

    }

    pub mod client {

        pub fn connect() {
            println!("connect to server")
        }

        pub fn send() {
            println!("send data to server")
        }

        pub fn receive() {
            println!("receive data from server")
        }
    }

}

在learn_rust二进制库中引用communicator外部库.

# 编辑Cargo.toml配置文件
[zhengtong@localhost learn_rust]$ vim Cargo.toml 
[package]
name = "learn_rust"
version = "0.1.0"
authors = ["zhengtong"]

[dependencies]
communicator = { path = "./communicator" }  //添加这行



# 引用communicator模块
[zhengtong@localhost learn_rust]$ vim src/main.rs

extern crate communicator;  // 引入外部库


fn main() {
    communicator::network::server::start();  // 调用外部库的server模块的start函数.
    println!("hello world!")
}

运行结果

cargo run
   Compiling communicator v0.1.0 (file:///Users/zhengtong/PycharmProjects/learn_rust/communicator)
   Compiling learn_rust v0.1.0 (file:///Users/zhengtong/PycharmProjects/learn_rust)
    Finished dev [unoptimized + debuginfo] target(s) in 0.47 secs
     Running `target/debug/learn_rust`
start the server!
hello world!

 
 

将模块代码拆分到另外一个文件中

communicator/src/lib.rs
[zhengtong@localhost learn_rust]$ vim communicator/src/lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}

pub mod network;    // 这里发生变化
communicator/src/network.rs
[zhengtong@localhost learn_rust]$ vim communicator/src/network.rs

pub mod server {    

    pub fn start() {
        println!("start the server!")
    }

    pub fn receive() {
        println!("receive data")
    }

    pub fn send() {
        println!("send data back to client")
    }

}

pub mod client {

    pub fn connect() {
        println!("connect to server")
    }

    pub fn send() {
        println!("send data to server")
    }

    pub fn receive() {
        println!("receive data from server")
    }
}

 
 

深度拆分模块代码

communicator/src/lib.rs
[zhengtong@localhost learn_rust]$ vim communicator/src/lib.rs

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
    }
}

pub mod network;    // 这里发生变化
communicator/src/network/mod.rs
pub mod server;     // 这里发生变化

pub mod client;     // 这里发生变化
communicator/src/network/server.rs
pub fn start() {
    println!("start the server!")
}

pub fn receive() {
    println!("receive data")
}

pub fn send() {
    println!("send data back to client")
}
communicator/src/network/client.rs
pub fn connect() {
    println!("connect to server")
}

pub fn send() {
    println!("send data to server")
}

pub fn receive() {
    println!("receive data from server")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 通用编程概念 变量与可变性 变量默认不可变,如需要改变,可在变量名前加 mut 使其可变。例如:let mut a...
    soojade阅读 12,625评论 2 30
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,273评论 19 139
  • 《鸟哥的Linux私房菜》笔记 提到Linux,就不得不提GNU和GPL授权所产生的自由软件(free softw...
    Zhang21阅读 13,009评论 0 15
  • 金秋,不一样的阳光!和着宇宙的风铃,悄然涌起,转瞬间,惊涛裂岸,刺破层云,霞光万道。摧开彩色云霓,涌动激情朵朵,泛...
    宏波_阅读 331评论 0 3
  • 说到过去,回忆中浮现出的是家乡的那山那水那人。村庄就在两边大山的山脚下,南北的距离,中间隔着一条小河,长年经久不息...
    唧哇哇阅读 623评论 0 1