【Rust自学】7.4. use关键字 Pt.1:use的使用与as关键字

📅 2026/7/23 18:48:51
【Rust自学】7.4. use关键字 Pt.1:use的使用与as关键字
7.4 use关键字 Pt.1use的使用与as关键字7.4.1. use的作用use的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则也就是只有公共的部分引入进来才可以用。7.4.2. use的使用看个例子mod front_of_house { pub mod hosting { pub fn add_to_waitlist() { } fn seat_at_table() { } } } use crate::front_of_house::hosting; pub fn eat_at_restaurant() { hosting::add_to_waitlist(); }这里先声明了一个front_of_house模块在它里面又声明了公共的子模块hosting,在hosting下有两个函数——公共的add_to_waitlist和私有的seat_at_table。然后使用use关键字把crate(也就是这整个文件)中的front_of_house模块下的子模块hosting引入到当前作用域。类似于文件系统中创建的文件链接也有点类似于C的using namespace。这样引入之后hosting这个名在当前作用域内就可以直接使用了就相当于hosting这个模块是在crate root下定义的。在下文的eat_at_restaurant函数中因为hosting已经被引入当前作用域了所以调用add_to_waitlist函数时就不用从crate起手写绝对路径抑或是从front_of_house起手写相对路径而是从hosting起手写就可以。但需要注意的是引入了作用域的模块仍然遵守私有性原则所以seat_at_table函数仍然不可被调用。use即可以使用绝对路径也可以使用相对路径比如上面例子中的use crate::front_of_house::hosting;就可以被修改为:use front_of_house::hosting;但一般来说使用绝对路径较多。7.4.3. use的使用惯例在上面的例子中我们导入模块只到了hosting这一层但调用的函数只有add_to_waitlist能不能直接一步到位导入add_to_waitlist呢实际上是可以的mod front_of_house { pub mod hosting { pub fn add_to_waitlist() { } fn seat_at_table() { } } } use crate::front_of_house::hosting::add_to_waitlist; pub fn eat_at_restaurant() { add_to_waitlist(); }这样写也是没有问题的但是不建议。如果代码比较多就不知道add_to_waitlist函数是在本地定义的还是在其他模块定义的。所以针对函数通常是引入到它的父模块通过父模块来调用函数来表示它不是本地定义的。但是要注意引入到函数的上一级就可以不用引入太多否则重复的输入就太多了。针对其他的条目比如struct、枚举等等一般都是指定完整路径指定到本身不用指定到父级。如下例:use std::collections::HashMap; fn main() { let mut map HashMap::new(); map.insert(1, 2); }使用标准库的collections模块下的HashMap这个结构体就直接引入它本身。在用的时候就直接使用HashMap这个名不带父级模块。如果是同名条目不论是不是函数都指定到父级以做区分。如下例use std::fmt; use std::io; fn f1() - fmt::Result { } fn f2() - io::Result { } fn main() { }在这个例子中不考虑编译问题只是作为演示例我既需要fmt下的Result也需要io下的Result所以说在引入时就得引入到父级fmt和io。如果不想这么写也可以使用as关键字。7.4.4. as关键字as关键字可以为引入的路径指定本地的别名。比如说我们修改一下上边的例子use std::fmt::Result; use std::io::Result as IoResult; fn f1() - Result { } fn f2() - IoResult { } fn main() { }这样就不用声明到父级而是直接声明到本身。