自定义函数和模块的使用
函数
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();
}