我正在尝试从another模块调用某个模块的功能(用于代码分解,组织,etc)。
这是我的箱子结构:
➜ 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::main
调用bin/one.rs
?use crate::lib::two;
中未添加use super::lib::two;
,use self::super::lib::two;
,bin/one.rs
中的任何一个。
编辑:我有:rustc 1.42.0 (b8cedc004 2020-03-09)
安装在Linux 5.3.0-45-generic上,物有所值。
edit 2:每当使用super
关键字时,我都会从rustc
中得到这个神秘的错误:
error[E0433]: failed to resolve: there are too many leading `super` keywords
而且在任何地方都找不到有关此问题的任何疑难解答。
edit 3:在lib.rs
中添加一个src
文件以声明lib
模块的结构,并在use mod_test::lib::two;
中写入one.rs
是可行的,但是:
1)违反了在我的箱子中不乘“哑模块声明文件”的想法。
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
包含二进制文件的项目的程序员感到困惑。可能有某种方法可以防止货物以这种方式特别处理bin
;但是,重命名可能是最好的选择。
如果do
希望将one.rs
编译为使用two
的单独可执行文件,则必须在与lib.rs
相同的目录中创建main.rs
文件。这也是Cargo的特殊文件,它定义了库箱的模块结构。// 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
可以not
bin
目录中的文件被编译为独立的二进制文件,而不是板条箱成员。因此,您必须使用“外部”名称来调用该板条箱。。它们被允许具有不同的结构。除非您要同时生成二进制文件和库,否则不需要两者。如果您想从任何二进制文件(包括在src中添加一个lib.rs文件,以声明lib模块的结构,并编写使用mod_test :: lib :: two;在one.rs中工作,但是:
1)违反了我的板条箱中不增加“哑模块声明文件”的想法。
2)我必须在两个不同的地方(在main.rs和lib.rs中)从字面上完全复制相同的信息
main.rs
和lib.rs
是两个不同的板条根
main.rs
)中使用库箱,则只需use
:use mod_test;
另请参见