首页 > 解决方案 > Rust 中的跨模块函数调用

问题描述

我正在尝试从另一个模块调用属于某个模块的函数(用于代码分解、组织)。

这是我的板条箱结构:

➜  mod_test git:(master) ✗ tree
.
├── Cargo.lock
├── Cargo.toml
└── src
    ├── bin
    │   └── one.rs
    ├── lib
    │   └── two.rs
    └── main.rs

3 directories, 5 files

main我声明:

pub mod bin {
    pub mod one;
}
pub mod lib {
    pub mod two;
}

所有这些文件都只包含一个简单的pub fn main() {println!("hello");}.

此时,一切正常

现在,是否可以拨打电话?lib::two::mainbin/one.rs

use crate::lib::two;, use super::lib::two;,中没有一个use self::super::lib::two;添加到bin/one.rs工作中。


error[E0433]: failed to resolve: there are too many leading `super` keywords

而且我在任何地方都找不到任何有关此问题的故障排除。

标签: modulerustcode-organizationrust-crates

解决方案


src/bin是 Cargo 的特殊目录名称。运行时,此目录中的文件将编译为独立的二进制文件cargo build。当编译为二进制文件时,它们不是定义在main.rsor中的 crate 结构的一部分lib.rs

如果您只想bin::one在内部用作模块main.rs,那么您已经可以使用了!您从one.rs作为独立二进制文件编译main.rs而不是bin::one作为模块编译时收到错误消息。如果你运行cargo run --bin <name-of-project>,编译会成功,它会运行程序main.rs

为了告诉 Cargo 不要自己编译one.rs,我建议重命名bin目录。这不仅解决了技术问题,而且不太可能混淆阅读项目的其他程序员,他们希望bin包含二进制文件。可能有一些方法可以防止 Cargobin以这种方式进行特殊处理;但是,重命名它可能是最好的选择。

如果你确实one.rs编译成一个单独的可执行文件two,你必须lib.rs在与main.rs. 这也是 Cargo 的一个特殊文件,它定义了库 crate 的模块结构。

// lib.rs
pub mod lib { /* note: this lib is not related to lib.rs; just unfortunately named */
    pub mod two;
}

然后在里面one.rs,写use <crate-name>::lib::two;

// bin/one.rs
use mod_test::lib::two;

crate::lib::two不起作用,因为目录中的文件bin编译为独立的二进制文件,而不是作为 crate 成员;因此,您必须通过其“外部”名称来调用板条箱。

在 src 中添加一个 lib.rs 文件,声明 lib 模块结构,并编写 use mod_test::lib::two; 在 one.rs 中有效,但是:

1)它破坏了在我的箱子中不增加“哑模块声明文件”的想法。

2)我必须在两个不同的地方(在 main.rs 和 lib.rs 中)复制完全相同的信息

main.rs并且lib.rs两个不同的箱子根。它们被允许具有不同的结构。除非您想同时生成二进制文件和库,否则您不需要两者。如果你想从任何二进制文件(包括)中使用main.rs库 crate ,它只是一个use远离:

use mod_test;

也可以看看


推荐阅读