跳到主要内容

自定义函数和模块的使用

函数

fn关键字,后面加上函数名 ,一般是写驼峰式,会发生警告,如果你想写成和java一样驼峰式,我们可以在代码最上面写上:

#[allow(non_snake_case)]

代表我允许驼峰。

建议

一般来说,是按照它的建议来写。

模块

Module就是模块,用于将函数或结构体按照功能分组,和别的语言的package类似。

使用mod关键字加上名称即可定义模块

mod lib {
fn show_me() {
// ...
}
}

private

注意,它这里无法调用,是因为显示它是private私有的。

注意: 它的公有关键字是pub,不是public

调用方式,使用两个冒号进行调用方法:lib::show_me()

main.rs

mod lib{
pub fn show_me() {
let my_name = "wujie";
let my_age = 18;
println!("我的名字是: {}, 年龄是: {}", my_name, my_age);
}
}
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::show_me();
}

现在是将mod放在main.rs文件里,如果放在外部该如何访问?

调用外部函数:同级调用

在和main.rs同级目录创建一个lib.rs

pub fn show_me() {
let my_name = "wujie";
let my_age = 18;
println!("我的名字是: {}, 年龄是: {}", my_name, my_age);
}

这里不使用mod进行包裹。

然后在main.rs

mod lib;
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::show_me();
}

mod lib;默认执行的时候去同级目录下寻找lib.rs文件里的show_me函数,模块名和文件名是一样的。


如果lib.rsmod没去掉,main.rs想要访问,也得在前面加上pub关键字

pub mod lib {
pub fn show_me() {
let my_name = "wujie";
let my_age = 18;
println!("我的名字是: {}, 年龄是: {}", my_name, my_age);
}
}

main.rs调用则必须还得再加一层名为lib的模块才能找到函数

mod lib;
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::lib::show_me();
}

调用外部函数:多文件夹

上面是在同一级目录下的lib.rs名称是这个,如果在加一层目录

├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│ ├── lib
│ │ └── mod.rs
│ └── main.rs

我们把上面的lib.rs删除,新建lib目录,下面新建一个固定名称的mod.rs,如果在main.rs加载lib目录的内容,会首先加载mod.rs,不过前提也得是pub的。

mod.rs

pub mod helper {
pub fn show_me() {
let my_name = "wujie";
let my_age = 18;
println!("我的名字是: {}, 年龄是: {}", my_name, my_age);
}
}

main.rs

mod lib; // lib.rs 或者 lib/mod.rs
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::helper::show_me();
}

注意

mod lib;会加载同级的lib.rs文件或者加载同级目录lib下的mod.rs文件,如果有多个文件夹嵌套,也是一样。

我们再在lib目录下新建一个config.rs,该如何获取它里面的内容

├── Cargo.lock
├── Cargo.toml
├── README.md
├── src
│ ├── lib
│ │ ├── config.rs
│ │ └── mod.rs
│ └── main.rs
pub mod config {
pub fn show_version() {
println!("version: 1.0")
}
}

注意

上面说了会默认先加载mod.rs里的内容,所以在mod.rs里加上引入config的模块

pub mod config; // config.rs 或者 config/mod.rs
pub mod helper {
pub fn show_me() {
let my_name = "wujie";
let my_age = 18;
println!("我的名字是: {}, 年龄是: {}", my_name, my_age);
}
}

main.rs加载模块同理,要么获取同级目录下的同模块名称rs文件,或者是同一级的模块名目录下mod.rs

main.rs调用

mod lib; // lib.rs 或者 lib/mod.rs
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::helper::show_me();

lib::config::config::show_version();
}

这里写了 2 个config的原因是config.rs里又套了一层mod,我们可以去掉

pub fn show_version() {
println!("version: 1.0")
}

main.rs

mod lib; // lib.rs 或者 lib/mod.rs
fn main() {
println!("u8最大值: {}, 最小值{}", u8::max_value(), u8::min_value());
lib::helper::show_me();

lib::config::show_version();
}