引用模块项目的路径
为了告诉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
}
我们第一次调用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() {}
}
在这里你可以直接看到,和之前的例子不同,在这你可以使用super
轻松地访问父级的模块。