Rust中的跨模块函数调用

问题描述 投票:0回答:1

我正在尝试从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.rslib.rs中)从字面上完全复制相同的信息

    3)use mod_test::lib::two;是唯一的工作语法,使用cratesuper关键字仍然会导致奥秘的编译器错误

module rust code-organization rust-crates
1个回答
0
投票

src/bin是Cargo的特殊目录名称。运行cargo build时,此目录中的文件被编译为独立的二进制文件。当编译为二进制文件时,它们不属于main.rslib.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.rslib.rs两个不同的板条根

。它们被允许具有不同的结构。除非您要同时生成二进制文件和库,否则不需要两者。如果您想从任何二进制文件(包括main.rs)中使用库箱,则只需use
use mod_test;

另请参见

© www.soinside.com 2019 - 2024. All rights reserved.