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")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

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