digoal
2022-04-18
PostgreSQL , PolarDB , rust , chatgpt
看官方手册讲mod的相对路径时, 有点没整明白. 使用chatgpt解释一下, 立马明白了.
https://kaisery.github.io/trpl-zh-cn/ch07-03-paths-for-referring-to-an-item-in-the-module-tree.html
看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。
路径有两种形式:
- 绝对路径(absolute path)是以
crate
根(root)开头的全路径;对于外部crate
的代码,是以crate
名开头的绝对路径,对于对于当前crate
的代码,则以字面值crate
开头。 - 相对路径(relative path)从当前模块开始,以
self
、super
或当前模块的标识符
开头。
mod front_of_house {
mod hosting {
fn add_to_waitlist() {}
}
}
pub fn eat_at_restaurant() {
// 绝对路径
crate::front_of_house::hosting::add_to_waitlist();
// 相对路径
front_of_house::hosting::add_to_waitlist();
}
第一种方式,我们在 eat_at_restaurant
中调用 add_to_waitlist
函数,使用的是绝对路径。add_to_waitlist
函数与 eat_at_restaurant
被定义在同一 crate
中,这意味着我们可以使用 crate
关键字为起始的绝对路径。
在 crate
后面,我们持续地嵌入模块,直到我们找到 add_to_waitlist
。你可以想象出一个相同结构的文件系统,我们通过指定路径 /front_of_house/hosting/add_to_waitlist
来执行 add_to_waitlist
程序。我们使用 crate
从 crate
根开始就类似于在 shell
中使用 /
从文件系统根开始。
第二种方式,我们在 eat_at_restaurant
中调用 add_to_waitlist
,使用的是相对路径。这个路径以 front_of_house
为起始,这个模块在模块树中,与 eat_at_restaurant
定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist
。以模块名开头意味着该路径是相对路径。
1、解释一下rust模块调用的相对路径
在Rust中,模块是代码组织的基本单位,可以通过关键字mod
来定义一个模块。当一个模块需要访问另一个模块中定义的项时,可以使用相对路径。
相对路径指的是从当前模块开始的相对位置来引用其他模块。例如,mod1
和mod2
是同级目录下的两个模块,且mod2
需要引用mod1
中的函数foo
,则可以在mod2
中使用相对路径来引用mod1
中的函数,如下所示:
mod mod1 {
pub fn foo() {
println!("Hello from module 1!");
}
}
// 用super先跳到mod2的外面, 也就是这个层面. 然后就使用::mod1
mod mod2 {
use super::mod1::foo; // 使用相对路径引入mod1中的foo函数
pub fn bar() {
foo();
}
}
fn main() {
mod2::bar(); // 输出:Hello from module 1!
}
在上述代码中,mod2
中使用了相对路径来引用mod1
中的函数foo
,使用了super::
来表示父级目录,即相对于mod2
的上一级目录。
需要注意的是,相对路径只能用于同一父级模块中的模块之间的引用。如果要跨父级模块引用,需要使用绝对路径。
2、self的例子也给一个
当一个模块需要引用自己中的其他项时,可以使用self关键字来引用自身,以避免使用冗长的相对路径。
例如,一个名为utils
的模块中定义了一个函数foo
和一个常量BAR
,可以在该模块中使用self
来引用这些项,如下所示:
mod utils {
const BAR: i32 = 42;
pub fn foo() {
println!("Hello from utils::foo! BAR = {}", BAR);
}
pub fn bar() {
self::foo(); // 使用self关键字引用自己中的函数foo
println!("Hello from utils::bar! BAR = {}", self::BAR); // 使用self关键字引用自己中的常量BAR
}
}
fn main() {
utils::bar(); // 输出: Hello from utils::foo! BAR = 42
Hello from utils::bar! BAR = 42
}
在上述代码中,utils
模块中的bar
函数通过使用self
关键字来引用自身中的函数foo
和常量BAR
。self
关键字在上下文中表示当前模块本身。