module systems
概述
主要包含三个部分:
package 下面是 crate
crate 下面是 module
crates
crate 是一个binary或者library,一个crate一般是一类方法
package
一个package包含多个crate,其中至多一个library类型的crate,binary类型的不限
而且一个package必须含有一个crate,不管啥类型
当使用cargo new的时候,cargo就创建了一个cargo.toml文件,如下:
caibin@caibin-MS-7C82:~/my/rust$ cargo new bincai
Created binary (application) `bincai` package
里面重点有两个文件,其中cargo.toml定义了这个package
Cargo.toml
./src/main.rs
main.rs就是crate的root,它是一个binary类型的,并与package名称相等,也就是crate的名字叫做bincai
如果里面还有个lib.rs,就是含有一个library类型的,并与package名称想等
另外,在src/bin目录下,可以放置多个binary类型的crate
modules
访问权限
首先,我们要知道,module是在crate里面的,然后把crate组织成不同的模块以方便管理,另外,mod要注意一下访问权限,rust所有条目的默认权限是private
加入我们调用一个方法,我们需要知道它的path,path又分为绝对路径和相对路径,下面就是绝对路径和相对路径的例子,但是下面的例子由于访问权限问题是错误的:
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
crate::front_of_house::hosting::add_to_waitlist();
front_of_house::hosting::add_to_waitlist();
}
- 绝对路径以crate开头的,其实crate就像linux里面的/
- 相对路径就是以具体的name开头
绝对路径和相对路径使用哪个要看代码如何变动,有的时候相对路径好,比如俩一起搬家
刚刚说了,上面的代码是错误的,那怎么是正确的呢?
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
crate::front_of_house::hosting::add_to_waitlist();
front_of_house::hosting::add_to_waitlist();
}
为什么front_of_house前面不需要public???是由于eat_at_restaurant和它在同一个module里面
super关键字的用法
super就是linux中的…的意思,就像下面这样使用
fn serve_order() {}
mod back_of_house {
fn fix_incorrect_order() {
cook_order();
super::serve_order();
}
fn cook_order() {}
}
struct和enum的访问权限
struct
我们把pub加到struct,但是struct里面的每个属性还是私有的
enum
如果我们把public加到enum上,那么里面所有属性都是pub的
use方法
内部use
use可以让我们不用写太长的,下面我们引入的是hosting这个module,引用也可以是相对地址
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use crate::front_of_house::hosting; //注意use到hosting,所以下面还需要写上hosting
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
同时,我们也可以直接引入到对应的方法,
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
use crate::front_of_house::hosting::add_to_waitlist;
pub fn eat_at_restaurant() {
add_to_waitlist();
add_to_waitlist();
add_to_waitlist();
}
引入上一级的好处时,加入我们需要两个同名type,来自不同的上级,这样就可以同时引用,就像下面这样都是result但是来源不同:
use std::fmt;
use std::io;
fn function1() -> fmt::Result {
}
fn function2() -> io::Result<()> {
}
也可以使用AS来解决这个问题
use std::fmt::Result;
use std::io::Result as IoResult;
fn function1() -> Result {
}
fn function2() -> IoResult<()> {
}
我们可以在use前面加上pub,这样其他的地方也可以调用
外部use
使用外部package我们需要先在cargo.toml里面加上
合并导入
比如导入可以使用{}一行导入多个
use std::cmp::Ordering;
use std::io;
use std::{cmp::Ordering, io};
将module拆分到多个文件
当modules很多的时候,我们可以拆分到 其他文件,比如下面这个例子:
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist() {}
}
}
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
我们就可以把front_of_house拆分到另外一个rs文件里面src/front_of_house.rs
pub mod hosting {
pub fn add_to_waitlist() {}
}
然后lib.rs变成:
mod front_of_house;
pub use crate::front_of_house::hosting;
pub fn eat_at_restaurant() {
hosting::add_to_waitlist();
hosting::add_to_waitlist();
hosting::add_to_waitlist();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)