文档章节

rust05模块

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 874
阅读 3
收藏 0

库(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")
}

本文转载自:http://www.jianshu.com/p/2abe3f8049ee

共有 人打赏支持
AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
JAVA9模块化详解(二)——模块的使用

JAVA9模块化详解(二)——模块的使用 二、模块的使用 各自的模块可以在模块工件中定义,要么就是在编译期或者运行期嵌入的环境中。为了提供可靠的配置和强健的封装性,在分块的模块系统中利...

小忽悠
2018/06/21
0
0
nginx源码分析——模块

模块介绍 高度模块化的设计是nginx的架构基础。在nginx中,除了少量的核心代码,其他一切皆为模块。这种模块化设计同时具有以下几个特点: 高度抽象的模块接口 所有的模块都遵循着同样的 ng...

hncscwc
2016/06/17
120
0
Ansible学习:(二)Ansible常用模块详解

常用模块: 1.command模块 2.shell模块 3.group模块 4.user模块 5.copy模块 6.file模块 7.mount模块 8.yum模块 9.service模块 10.cron模块 1.command模块 远程主机运行命令 [root@guoxh ~]# ...

郭晓辉gg
2017/04/09
0
0
RDIFramework.NET ━ .NET快速信息化系统开发框架- 4.8 模块(菜单)管理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/7979379 RDIFramework.NET ━ .NET快速信息化系统开发框架 4.8 模块(菜单)管理...

rdiframework
2012/09/14
0
0
【ABP框架系列学习】模块系统(4)

原文:【ABP框架系列学习】模块系统(4) 0.引言 ABP提供了构建模块和通过组合模块以创建应用程序的基础设施。一个模块可以依赖于另外一个模块。通常,程序集可以认为是模块。如果创建多个程序集...

杰克.陈
2018/11/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink的Table API及SQL Programs

序 本文主要研究一下flink的Table API及SQL Programs 实例 // for batch programs use ExecutionEnvironment instead of StreamExecutionEnvironmentStreamExecutionEnvironment env = Stre......

go4it
21分钟前
0
0
mysqldump应用

备份单个库/表数据或库/表结构 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 备份文件名 1、导出数据库为dbname的表结构(其中用戶名為root,密码为dbpasswd,生成的...

阿dai
28分钟前
0
0
shell脚本与Python的交互

1、Python针对shell获取传入,输出参数 传入:"$num" 例如: $0表示文件名,$1表示shell获取的第一个参数 输出:通过打印shell结果的方式,输出参数给Python。 例如: echo "{$iplist}",Python调...

一口今心
31分钟前
0
0
Euler 今日问世!国内首个工业级的图深度学习开源框架,阿里妈妈造

阿里妹导读:千呼万唤始出来!阿里妈妈正式公布重磅开源项目——图深度学习框架Euler。这是国内首个在核心业务大规模应用后开源的图深度学习框架。此次开源,Euler内置了大量的算法供用户直接...

阿里云官方博客
38分钟前
0
0
TiDB 3.0 Beta Release Notes

2019 年 1 月 19 日,TiDB 发布 3.0 Beta 版,对应 master branch 的 TiDB-Ansible。相比 2.1 版本,该版本对系统稳定性、优化器、统计信息以及执行引擎做了很多改进。 TiDB 新特性 支持 Vi...

TiDB
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部