[易学易懂系列|rustlang语言|零基础|快速入门|(18)|use关键词]
[易学易懂系列|rustlang语言|零基础|快速入门|(18)|use关键词]
实用知识
use关键词
我们今天来讲讲use关键词。
1.简单来说,use是给其他方法或资源定义一个别名,然后调用者,就可以直接用这个别名来调用,从而简化代码。
看下例子吧,我们先来看看没有用use的代码:
// -- Initial code without the `use` keyword --
mod phrases {
pub mod greetings {
pub fn hello() {
println!("Hello, world!");
}
}
}
fn main() {
phrases::greetings::hello(); // Using full path
}
如果没有用use,我们的代码是很繁琐的。
我们现在用use,来看看有什么效果:
// -- Usage of the `use` keyword --
// 01. Create an alias for module
use phrases::greetings;
fn main() {
greetings::hello();
}
这里,我们看到是对模块phrases和子模块greetings,创建一个别名:phrases::greetings。
当然,我们也可以对模块中的元素进行重新创建别名,看代码:
// 02. Create an alias for module elements
use phrases::greetings::hello;
fn main() {
hello();
}
当然,我们也可以把这个别名重新命名,看代码:
// 03. Customize names with the `as` keyword
use phrases::greetings::hello as greet;
fn main() {
greet();
}
2.导入元素到作用域
我们之前的测试例子,其实就用到这个功能。
请看代码:
fn hello() -> String {
"Hello, world!".to_string()
}
#[cfg(test)]
mod tests {
use super::hello; // Import the `hello()` function into the scope
#[test]
fn test_hello() {
assert_eq!("Hello, world!", hello()); // If not using the above `use` statement, we can run same via `super::hello()`
}
}
其中,super代表当前模块从父模块导入相关资源。那我们可以推断self就代表当前模块了。
是的,正确。
现在我们再来看看标准库的use用法 :
// -- 01. Importing elements --
use std::fs::File;
fn main() {
File::create("empty.txt").expect("Can not create the file!");
}
// -- 02. Importing module and elements --
std::fs::{self, File} // `use std::fs; use std::fs::File;`
fn main() {
fs::create_dir("some_dir").expect("Can not create the directry!");
File::create("some_dir/empty.txt").expect("Can not create the file!");
}
// -- 03. Importing multiple elements --
use std::fs::File;
use std::io::{BufReader, BufRead}; // `use std::io::BufReader; use std::io::BufRead;`
fn main() {
let file = File::open("src/hello.txt").expect("file not found");
let buf_reader = BufReader::new(file);
for line in buf_reader.lines() {
println!("{}", line.unwrap());
}
}
3.重新暴露
这里的重新暴露,是指通过一个固定模块,把子模块的相关资源暴露给外部。
看代码:
// ↳ main.rs
mod phrases;
fn main() {
phrases::hello(); // Not directly map
}
// ↳ phrases/mod.rs
pub mod greetings;
pub use self::greetings::hello; // Re-export `greetings::hello` to phrases
// ↳ phrases/greetings.rs
pub fn hello() {
println!("Hello, world!");
}
以上,希望对你有用。
如果遇到什么问题,欢迎加入:rust新手群,在这里我可以提供一些简单的帮助,加微信:360369487,注明:博客园+rust
本人精通java高并发,DDD,微服务等技术实践,专注java,rust技术栈。 本人姓名郭莹城,坐标深圳,前IBM架构师、咨询师、敏捷开发技术教练,前IBM区块链研究小组成员、十多年架构设计工作经验,《区块链核心技术与应用》作者之一, 现聚焦于:区块链创投与交易所资源对接和技术咨询。 工作微信&QQ:360369487,区块链创投与交易所资源对接,加我注明:博客园+对接,技术咨询和顾问,加我注明:博客园+顾问。想学习golang和rust的同学,也可以加我微信,备注:博客园+golang或博客园+rust,谢谢!