module - 使用嵌套模块中的项目时为 "unresolved import"

标签 module rust visibility rust-crates

我有一个小程序,我一直在尝试使其工作,但我不断收到 Unresolved 导入消息。

main.rs:

mod sub_module;
use sub_module::a_structure;

fn main() {
    let x: a_structure = /* init code */;
}

子模块.rs:

pub mod sub_sub_module;

pub use sub_sub_module::a_structure;

sub_sub_module.rs:

pub struct a_structure<T> {
    some_field: i32,
}

但是,在执行cargo build时,我得到一个“未解析的导入sub_sub_module::a_struct”。我发现的有关可见性的所有内容都表明这应该有效,但事实并非如此。我在这里缺少什么?

最佳答案

将 Rust 模块视为目录树。模块是目录,其他一切都是文件 [1]。 :: 基本上是 /

所以,你有这个结构:

/ (crate root)
 └┬─ sub_module
  │   └┬─ sub_sub_module
  │    │   └── a_structure
  │    └─ a_structure [x]
  ├─ a_structure
  └─ main

问题在于如何定义a_struct [x]“符号链接(symbolic link)”。正如书中所解释的,use paths in Rust are absolute ,在这个类比中意味着它们全部隐式地以/开头。这意味着 use sub_sub_module::a_struct 引用了 /sub_sub_module/a_struct,而它不存在

解决方案是通过显式使用 self (实际上是 .)或 super (实际上是 ..)。您需要 ./sub_sub_module/a_struct,因此 Rust 中的路径应该是 self::sub_sub_module::a_struct。完整的编译(带有警告)示例如下所示:

mod sub_module {
    pub mod sub_sub_module {
        pub struct a_structure {
            some_field: i32,
        }
    }

    pub use self::sub_sub_module::a_structure;
}

use sub_module::a_structure;

fn main() {
    let x: a_structure = panic!("TODO");
}

您还应该注意,use外部任何地方使用的路径具有完全相反的默认值:默认情况下,它们是相对于包含模块的。如果在这种情况下您想要绝对路径,则需要通过以 :: 开头的路径来显式请求一个绝对路径(就像默认情况下的文件系统路径一样,解释为相对)。

旁白:传统的风格是使用 PascalCase 作为类型名称。另外,我必须删除类型参数,因为它没有被使用。


[1]:这实际上是一个谎言,因为您可以将项目与其他项目关联起来。例如,关联的 const 虽然不稳定,但却是一件事。我想你可以从资源 fork 或其他什么角度来思考它们,我不知道;这只是一个比喻!

关于module - 使用嵌套模块中的项目时为 "unresolved import",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36230543/

相关文章:

配置更改后 Java Android Badge Drawable 无法正常工作

excel - 如何: Excel 2003 macro to sum visible values only?

java - 如何创建多 war war 模块?

ios - 使用 Swift 4.1 编译的模块无法在 Swift 3.2.3 中导入

ruby-on-rails - rails : How do I write tests for a ruby module?

rust - 为什么重新借用仅适用于取消引用的指针?

css - 使用 Raphael JS 在 Opera 中渲染 SVG 时出现问题

javascript - ReferenceError : BASE_URL is not defined, Angular JS 依赖项

c++ - 编译为 wasm 的 C++ 和 Rust 程序能否以某种方式互操作?

rust - 为什么即使在未来解决之后,在循环中使用带有 Tokio future 的克隆 super 客户端也会阻塞?