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
作品中。
编辑:我在 Linux 5.3.0-45-generic 上安装了 rustc 1.42.0 (b8cedc004 2020-03-09)
,物有所值。
编辑 2:每当使用 super
关键字时,我都会从 rustc
:
得到这个神秘的错误
error[E0433]: failed to resolve: there are too many leading `super` keywords
而且我在任何地方都找不到关于此问题的任何疑难解答。
编辑 3:在 src
中添加一个 lib.rs
文件,声明 lib
模块结构,并在 one.rs
中写入 use mod_test::lib::two;
有效,但是:
1) 它打败了我箱子里不乘法 "dumb module declaration files" 的想法。
2) 我必须在两个不同的地方(在 main.rs
和 lib.rs
中)逐字复制完全相同的信息
3) use mod_test::lib::two;
是唯一有效的语法,使用 crate
或 super
关键字仍然会导致神秘的编译器错误
src/bin
是 Cargo 的特殊目录名。当您 运行 cargo build
时,此目录中的文件被编译为独立的二进制文件。当编译为二进制文件时,它们不是 main.rs
或 lib.rs
.
中定义的 crate 结构的一部分
如果您只想使用 bin::one
作为 main.rs
中的一个模块,您已经可以使用了!将 one.rs
编译为独立二进制文件会收到错误消息,而不是将 main.rs
与 bin::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.rs
和 lib.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?
我正在尝试从 另一个 模块调用属于某个模块的函数(用于代码分解、组织、等)。
这是我的箱子结构:
➜ 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
作品中。
编辑:我在 Linux 5.3.0-45-generic 上安装了
rustc 1.42.0 (b8cedc004 2020-03-09)
,物有所值。编辑 2:每当使用
super
关键字时,我都会从rustc
: 得到这个神秘的错误
error[E0433]: failed to resolve: there are too many leading `super` keywords
而且我在任何地方都找不到关于此问题的任何疑难解答。
编辑 3:在
src
中添加一个lib.rs
文件,声明lib
模块结构,并在one.rs
中写入use mod_test::lib::two;
有效,但是:1) 它打败了我箱子里不乘法 "dumb module declaration files" 的想法。
2) 我必须在两个不同的地方(在
main.rs
和lib.rs
中)逐字复制完全相同的信息3)
use mod_test::lib::two;
是唯一有效的语法,使用crate
或super
关键字仍然会导致神秘的编译器错误
src/bin
是 Cargo 的特殊目录名。当您 运行 cargo build
时,此目录中的文件被编译为独立的二进制文件。当编译为二进制文件时,它们不是 main.rs
或 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
包含二进制文件。可能有一些方法可以防止 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.rs
和 lib.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?