module - 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::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 上,物有所值。编辑2:每当使用
super
关键字时,我都会从以下位置得到这个神秘的错误rustc
:
error[E0433]: failed to resolve: there are too many leading `super` keywords
而且我在任何地方都找不到任何有关此问题的故障排除。
编辑3:在声明模块结构中添加一个
lib.rs
文件,并在作品中编写,但是:src
lib
use mod_test::lib::two;
one.rs
1)它破坏了在我的箱子中不增加“哑模块声明文件”的想法。
main.rs
2)我必须在两个不同的地方(in和inlib.rs
)复制完全相同的信息3)
use mod_test::lib::two;
是唯一有效的语法,使用crate
orsuper
关键字仍然会导致神秘的编译器错误
解决方案
src/bin
是 Cargo 的特殊目录名称。运行时,此目录中的文件将编译为独立的二进制文件cargo build
。当编译为二进制文件时,它们不是定义在main.rs
or中的 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;
也可以看看
推荐阅读
- python - 什么是 PEP-249?
- sql - 奇怪的 WHERE 语句,其行为类似于 GROUP BY?
- python - 无法在 Python 2.7 中为 ldap 设置 TIMEOUT
- java - 如何在 Java 中比较两个图像?
- r - 将日期过滤器添加到 Flexdashboard
- python - 如何将模型实例连接到 django 中的用户?
- pine-script - 在 pine 脚本中获取先前的交易利润百分比
- flask - 如何将随机颜色十六进制从烧瓶后端发送到 html
- javascript - jQuery 替代 div 元素
- android-room - Room.databaseBuilder 中的数据库名称是什么?