Rust 中的跨模块函数调用

Cross-module function call in 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");}.

至此,一切ok

现在,是否可以从 bin/one.rs 调用 lib::two::main

use crate::lib::two;use super::lib::two;use self::super::lib::two;

None 添加到 bin/one.rs 作品中。


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

而且我在任何地方都找不到关于此问题的任何疑难解答。

src/bin 是 Cargo 的特殊目录名。当您 运行 cargo build 时,此目录中的文件被编译为独立的二进制文件。当编译为二进制文件时,它们不是 main.rslib.rs.

中定义的 crate 结构的一部分

如果您只想使用 bin::one 作为 main.rs 中的一个模块,您已经可以使用了!将 one.rs 编译为独立二进制文件会收到错误消息,而不是将 main.rsbin::one 作为模块编译时会收到错误消息。如果你运行cargo run --bin <name-of-project>,编译成功就会运行main.rs.

中的程序

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

如果您希望将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 成员;因此,您必须通过其 "external" 名称来调用 crate。

adding a lib.rs file in src declaring the lib module structure, and writing use mod_test::lib::two; in one.rs works, but:

1) it defeats the idea of not multiplying "dumb module declaration files" in my crate.

2) I have to literally copy the exact same information at two different places (in main.rs and in lib.rs)

main.rslib.rs 两个不同的板条箱根 。它们可以有不同的结构。除非您想同时生成二进制文件和库,否则您不需要两者。如果您想从任何二进制文件(包括 main.rs)中 使用 库 crate,只需 use 即可:

use mod_test;

另见

  • Rust modules confusion when there is main.rs and lib.rs
  • Rust package with both a library and a binary?