文档章节

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灵感
粉丝 10
博文 2634
码字总数 82983
作品 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
JAVA9模块化详解(二)——模块的使用

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

小忽悠
06/21
0
0
[软件架构]模块化编程思想及(C++)实践

模块化思想 1. 将系统分成很多的模块,模块内部关注自身需要实现的核心业务。 2. 模块化的典型特点是:“模块间的低耦合”和“模块内的高聚合”。 模块的构成 1. 名称。全局范围内表明该模块...

梁欢
2014/10/11
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

没有更多内容

加载失败,请刷新页面

加载更多

Django支持中文

django是支持中文界面, 先找到Django语言包安装目录,我的在: /usr/local/python3/lib/python3.6/site-packages/django/conf/locale 有zh-Hans和zh-Hant两个文件, 其中zh-Hans是简体中文,...

MichaelShu
17分钟前
1
0
迷宫问题:顺序栈解法

采用顺序栈以及回溯法,一个比较简单的问题,但是从来没有写过,也算是弥补一下自己欠数据结构的债吧,居然也花了一个半小时,无地自容了。。 定义好数据结构求解算法就显得容易一些了。 st...

LoSingSang
23分钟前
0
0
Zookeeper 概述及应用场景

一、概述 分布式协调技术,主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果。 ZooKeeper是一个分布式的,开放源码的分布式应用...

PeakFang-BOK
31分钟前
0
0
(译)OpenGL ES2.0 – Iphone开发指引

教程截图: OpenGL ES 是可以在iphone上实现2D和3D图形编程的低级API。 如果你之前接触过 cocos2d,sparrow,corona,unity 这些框架,你会发现其实它们都是基于OpenGL上创建的。 多数程序员...

robslove
41分钟前
0
0
金九银十跳槽季,程序员面试点解析之Java专场

前言 近年来Java工程师这个岗位炙手可热,市场需求大,学习Java的人也越来越多,所以IT企业与求职者的选择都比较多,那么IT企业在面试时都会提哪些问题呢。下面为大家分享 Java高级工程师面试...

老道士
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部