喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(=・ω・=)
7.3.1. use的作用
use
的作用是将路径导入到当前作用域内。而引入的内容仍然是遵守私有性原则,也就是只有公共的部分引入进来才可以用。
7.3.2. use的使用
看个例子:
rust">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
即可以使用绝对路径,也可以使用相对路径,比如上面例子中的:
rust">use crate::front_of_house::hosting;
就可以被修改为:
rust">use front_of_house::hosting;
但一般来说,使用绝对路径较多。
7.3.3. use的使用惯例
在上面的例子中,我们导入模块只到了use
这个层级,但调用的函数只有add_to_waitlist
,能不能直接一步到位导入add_to_waitlist
呢?实际上是可以的:
rust">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、枚举等等,一般都是指定完整路径(指定到本身),不用指定到父级。如下例:
rust">use std::collections::HashMap; fn main() { let mut map = HashMap::new(); map.insert(1, 2);
}
使用标准库的collection
模块下的Hashmap
这个结构体,就直接引入它本身。在用的时候就直接使用Hashmap
这个名,不带父级模块。
如果是同名条目,不论是不是函数,都指定到父级以做区分。如下例:
rust">use std::fmt;
use std::io; fn f1() -> fmt::Result { } fn f2() -> io::Result { }fn main() { }
在这个例子中(不考虑编译问题,只是作为演示例),我既需要fmt
下的Result
,也需要io
下的Result
,所以说在引入时就得引入到父级fmt
和io
。
如果不想这么写,也可以使用as
关键字。
7.3.4. as关键字
as
关键字可以为引入的路径指定本地的别名。比如说我们修改一下上边的例子:
rust">use std::fmt::Result;
use std::io::Result as IoResult; fn f1() -> Result { } fn f2() -> IoResult { }
fn main() { }
这样就不用声明到父级,而是直接声明到本身。