Rust:根目录中没有“模块”

Eva*_*oll 8 import rust

当我运行use crate::feed;时,src/cmdline.rs 我希望 import src/feed.rs,但事实并非如此。相反我得到,

error[E0432]: unresolved import `crate::feed`
 --> src/cmdline.rs:2:5
  |
2 | use crate::feed;
  |     ^^^^^^^^^^^ no `feed` in the root
Run Code Online (Sandbox Code Playgroud)

尽管事实src/feed.rs存在。但是,如果我恐慌并将其更改为mod feed;那么我会得到

error[E0583]: file not found for module `feed`
 --> src/cmdline.rs:2:1
  |
2 | mod feed;
  | ^^^^^^^^^
  |
  = help: to create the module `feed`, create file "src/cmdline/feed.rs"
Run Code Online (Sandbox Code Playgroud)

使用mod super::

error: expected identifier, found keyword `super`
 --> src/cmdline.rs:2:5
  |
2 | mod super::feed;
  |     ^^^^^ expected identifier, found keyword
Run Code Online (Sandbox Code Playgroud)

或者与use super::

error[E0432]: unresolved import `super::feed`
 --> src/cmdline.rs:2:5
  |
2 | use super::feed;
  |     ^^^^^^^^^^^ no `feed` in the root
Run Code Online (Sandbox Code Playgroud)

相关文件的文件结构如下所示,

src/feed.rs
src/cmdline.rs
src/main.rs
Run Code Online (Sandbox Code Playgroud)

dge*_*low 9

通过执行以下操作,我能够使我的导入按照您描述的方式工作。

首先,main.rs我导入模块cmdline以及我希望能够通过crate::.

// file src/main.rs
mod cmdline;
mod feed; // <== import module to be able to use via `crate::feed`

fn main() {
  cmdline::do_something();
}
Run Code Online (Sandbox Code Playgroud)

然后在cmdline.rs我使用create::feed.

// file src/cmdline.rs

use crate::feed; // <== import sibling module

pub fn do_something() {
  feed::do_something_else();
}
Run Code Online (Sandbox Code Playgroud)

我的feed.rs看起来像这样。

// file src/feed.rs
pub fn d_something_else() {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

据我从实验中了解到,您需要首先使用modinmain.rs来定义您的板条箱中包含哪些模块。


Eva*_*oll 7

我想到了。Rust 模块系统不允许导入同级文件,

  • src/a.rs
  • src/b.rs

句号:a.rs无法导入b.rs。它要做的就是尝试从以下来源获取它

  • src/a/b.rs

如果您正在考虑这个答案,那么这些对您来说可能都没有意义,并且您已经在这上面浪费了时间。这是我困惑的一个根源:

  • src/main.rs

其实很特别。src/main.rs在a内部mod将导入同级文件(也可以使用现已弃用的mod.rs; 或 with lib.rs)。但关键是您自己的 Rust 文件无法使用同级文件中的 Rust 代码。