$ rustc --version
rustc 1.44.0 (49cae5576 2020-06-01)

将代码存在到不同的文件

main.rs

mod aa;

fn main() {
println!("------------------------------------");
aa::aa1(); }

mod aa表示引入aa模块,在rust中一个文件名就代表一个模块,创建aa.rs文件

aa.rs

pub fn aa1(){
println!("---aa-----");
}
$ cargo run
Compiling crate_path v0.1.0 (/opt/wks/rust_study/crate_path)
Finished dev [unoptimized + debuginfo] target(s) in 0.20s
Running `target/debug/crate_path`
------------------------------------
---aa-----

将代码存到不到的目录

src下第一层目录文件结构

aa

aa.rs

main.rs

aa目录下有文件

bb.rs

cc.rs

rust中mod模块与文件名一一对应,存在一个mod aa,就必须得有一个叫aa.rs的文件存在;

但文件中不能再放文件,目录才可以放文件,于是rust就创建一个同名的目录,也叫aa,目录aa下再放其他文件

main.rs

mod aa;

fn main() {
println!("------------------------------------------------");
aa::bb::bb1();
aa::cc::cc1();
}

aa.rs

pub mod bb;
pub mod cc;

aa/bb.rs

pub fn bb1(){
println!("-----------bb1-----------");
}

aa/cc.rs

pub fn cc1(){
println!("--------------cc1------------");
}

上面是两个可运行的例子,下面是完整的体系式的概念

Packages and Crates

package is one or more crates that provide a set of functionality. A package contains a Cargo.toml file that describes how to build those crates.

A crate is a binary or library.

src/main.rs is the crate root of a binary crate with the same name as the package.

Likewise, Cargo knows that if the package directory contains src/lib.rs, the package contains a library crate with the same name as the package, and src/lib.rs is its crate root. Cargo passes the crate root files to rustc to build the library or binary.

$ cargo new my-project
Created binary (application) `my-project` package
$ ls my-project
Cargo.toml
src
$ ls my-project/src
main.rs

Here, we have a package that only contains src/main.rs, meaning it only contains a binary crate named my-project. If a package contains src/main.rs and src/lib.rs, it has two crates: a library and a binary, both with the same name as the package. A package can have multiple binary crates by placing files in the src/bin directory: each file will be a separate binary crate.

Defining Modules to Control Scope and Privacy

the use keyword that brings a path into scope; and the pub keyword to make items public. We’ll also discuss the as keyword, external packages, and the glob operator.

. Create a new library named restaurant by running cargo new --lib restaurant;

mod front_of_house {
mod hosting {
fn add_to_waitlist() {} fn seat_at_table() {}
} mod serving {
fn take_order() {} fn serve_order() {} fn take_payment() {}
}
} fn main() {}

By using modules, we can group related definitions together and name why they’re related. Programmers using this code would have an easier time finding the definitions they wanted to use because they could navigate the code based on the groups rather than having to read through all the definitions. Programmers adding new functionality to this code would know where to place the code to keep the program organized.

Earlier, we mentioned that src/main.rs and src/lib.rs are called crate roots. The reason for their name is that the contents of either of these two files form a module named crate at the root of the crate’s module structure, known as the module tree.

crate
└── front_of_house
├── hosting
│ ├── add_to_waitlist
│ └── seat_at_table
└── serving
├── take_order
├── serve_order
└── take_payment

如果你有很多文件,要在A文件中引用B的模型,就可以从根模型开始引用, 比如

crate::serving::take_order

从 crate:: 你可以路径到任一个定义的 mod, 只要它们有 pub 权限

Paths for Referring to an Item in the Module Tree

A path can take two forms:

An absolute path starts from a crate root by using a crate name or a literal crate.
A relative path starts from the current module and uses self, super, or an identifier in the current module.
Both absolute and relative paths are followed by one or more identifiers separated by double colons (::).

Bringing Paths into Scope with the use Keyword

创建新项目

aa.rs

mod bb {
pub mod bb1{ pub fn bb1_1(){
println!("aa --> bb --> bb1 --> bb1_1");
} pub fn bb1_2(){
println!("-----self ----------------");
self::bb1_1();
}
} pub fn bb2(){
println!("aa --> bb --> bb2");
} } //相当于在本crate中提供一个pub方法,供外部调用
use self::bb::bb1::bb1_1 as b1;
pub fn aa1(){
b1();
} //让pub bb2在其父mod bb私有的提前下,可供外部程序调用
//bb2本身必须pub
pub use self::bb::bb2; //对外提供一个pub模块
pub mod cc { //crate是绝对路径,root crate是main.rs
use crate::aa::bb::bb1::bb1_2 as b2;
pub fn cc1(){
b2();
} pub mod cc2{
pub fn cc2_1(){
println!("aa --> cc --> cc2 --> cc2_1");
}
} }

main.rs

mod aa;

use aa::cc::cc2;

fn main(){
println!("-----------------------------------");
aa::aa1();
aa::cc::cc1();
aa::bb2();
cc2::cc2_1();
}

输出

$ cargo run
Compiling test_lib v0.1.0 (/opt/wks/rust_study/test_lib)
Finished dev [unoptimized + debuginfo] target(s) in 0.21s
Running `target/debug/test_lib`
-----------------------------------
aa --> bb --> bb1 --> bb1_1
-----self ----------------
aa --> bb --> bb1 --> bb1_1
aa --> bb --> bb2
aa --> cc --> cc2 --> cc2_1

======================================================================================

上面的方式是可以运行的,但每个目录还要建立一个同名的rs文件,看上去不怎么好看。下面介绍另外一种方式

将同名的rs文件放到同名的目录下,统一重命名为mod.rs

其他的没有变化,移动位置,重命名为mod.rs,然后就可以了

最新文章

  1. Nova 组件详解 - 每天5分钟玩转 OpenStack(26)
  2. JavaScipt 事件体系
  3. 在SharePoint 2013中显示“以其他用户身份登录”
  4. (Extjs)对于GridPanel的各种操作
  5. appium运行报错.<init>(Lorg/openqa/selenium/remote/ErrorCodes;Z)V
  6. seafile
  7. -_-#【CSS】注释
  8. MAC地址格式小结
  9. [UI] APP界面设计流程
  10. .net简单的静态页生成
  11. 读【10问PHP程序员】 有感
  12. centos7 python3 pip
  13. sql习题及答案
  14. 可持久化trie学习笔记
  15. express 对数据库数据增删改查
  16. JDK的安装及环境变量配置
  17. String Permutation
  18. 【转载】在MySQL登录时出现Access denied for user 'root'@'localhost' (using password: YES) 拒绝访问,并可修改MySQL密码
  19. [JSOI2004]平衡点/[BZOJ3680]吊打XXX
  20. 【WPF】使用CefSharp嵌入HTML网页

热门文章

  1. 好好的 Tair 排行榜不用,非得自己写?20 行代码实现高性能排行榜
  2. pyinstaller打包:AttributeError: module ‘win32ctypes.pywin32.win32api’ has no attribute ‘error’
  3. dart系列之:dart类中的构造函数
  4. Python知识整理(二)
  5. Python基础(使用模块)
  6. Winform开发的快速、健壮、解耦的几点建议
  7. mysql密码忘记如何恢复(windows/liunx版本:mysql-8.0.27)
  8. c语言是如何处理函数调用的?
  9. 流程图(flowchart)语法学习
  10. 简单聊下.NET6 Minimal API的使用方式