引用模块项目的路径

为了告诉Cairo如何在模块树中找到一个项目,我们使用路径的方式,就像在文件系统使用路径一样。为了调用一个函数,我们需要知道它的路径。

路径可以有两种形式:

  • 绝对路径( absolute path )是以 crate 根(root)开头的全路径。绝对路径以 crate 名开头。
  • 相对路径( relative path )是从当前模块开始的。

绝对路径和相对路径后面都有一个或多个标识符用双冒号(::)分开。

为了说明这个概念,让我们回到我们在上一章使用的餐厅的例子示例7-1。我们有一个名为 restaurant的crate,其中有一个名为front_of_house的模块,包含一个名为 hosting的模块。hosting模块包含一个名为 add_to_waitlist的函数。我们想从eat_at_restaurant函数中调用add_to_waitlist函数。我们需要告诉Cairo add_to_waitlist函数的路径,以便它能找到它。

文件名: src/lib.cairo

mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}

        fn seat_at_table() {}
    }

    mod serving {
        fn take_order() {}

        fn serve_order() {}

        fn take_payment() {}
    }
}


fn eat_at_restaurant() {
    // Absolute path
    restaurant::front_of_house::hosting::add_to_waitlist(); // ✅ Compiles

    // Relative path
    front_of_house::hosting::add_to_waitlist(); // ✅ Compiles
}

示例7-3:使用绝对和相对路径调用add_to_waitlist函数

我们第一次调用eat_at_restaurant中的add_to_waitlist函数时、使用了一个绝对路径。add_to_waitlist函数与eat_at_restaurant定义在同一个crate中。在Cairo中,绝对路径从crate根开始,你需要用crate的名字来引用它。

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

使用 super 起始的相对路径

选择是否使用 super将根据你的项目具体情况来决定。 并取决于你是否更有可能将项目定义的代码是与使用该项目的代码分开还是放在一起。

文件名: src/lib.cairo

fn deliver_order() {}

mod back_of_house {
    fn fix_incorrect_order() {
        cook_order();
        super::deliver_order();
    }

    fn cook_order() {}
}

示例7-4:使用以super开头的相对路径调用一个函数

在这里你可以直接看到,和之前的例子不同,在这你可以使用super轻松地访问父级的模块。

Last change: 2023-09-20, commit: cbb0049