Skip to content

Latest commit

 

History

History
132 lines (82 loc) · 5.79 KB

20230418_01.md

File metadata and controls

132 lines (82 loc) · 5.79 KB

用chatGPT 作为学习RUST的助手

作者

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)从当前模块开始,以 selfsuper当前模块的标识符开头。
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 程序。我们使用 cratecrate 根开始就类似于在 shell 中使用 / 从文件系统根开始。

第二种方式,我们在 eat_at_restaurant 中调用 add_to_waitlist,使用的是相对路径。这个路径以 front_of_house 为起始,这个模块在模块树中,与 eat_at_restaurant 定义在同一层级。与之等价的文件系统路径就是 front_of_house/hosting/add_to_waitlist。以模块名开头意味着该路径是相对路径。

chatGPT 问答

1、解释一下rust模块调用的相对路径

在Rust中,模块是代码组织的基本单位,可以通过关键字mod来定义一个模块。当一个模块需要访问另一个模块中定义的项时,可以使用相对路径。

相对路径指的是从当前模块开始的相对位置来引用其他模块。例如,mod1mod2是同级目录下的两个模块,且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和常量BARself关键字在上下文中表示当前模块本身。

digoal's wechat