自定义函数和模块的使用
函数
fn关键字,后面加上函数名 ,一般是写驼峰式,会发生警告,如果你想写成和java一样驼峰式,我们可以在代码最上面写上:
#[allow(non_snake_case)]
代表我允许驼峰。
一般来说,是按照它的建议来写。
模块
Module就是模块,用于将函数或结构体按照功能分组,和别的语言的package类似。
使用mod关键字加上名称即可定义模块
mod lib {
fn show_me() {
// ...
}
}

注意,它这里无法调用,是因为显示它是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.rs的mod没去掉,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();
}