使用嵌套模块中的项时“未解析的导入”

时间:2016-03-26 01:18:31

标签: module rust visibility rust-crates

我有一个小程序,我一直在努力工作,但我一直得到未解决的导入消息。

main.rs:

mod sub_module;
use sub_module::a_structure;

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

sub_module.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_structure”。我发现的关于可见性的一切都说这应该有效,但事实并非如此。我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

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

所以,你有这个结构:

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

问题在于如何定义a_structure [x]&#34;符号链接&#34;。正如本书use paths in Rust are absolute中所解释的那样,在这个类比中,他们 all 隐含地以/开头。意味着use sub_sub_module::a_structure指的是/sub_sub_module/a_structure不存在

解决方案是通过使用self(有效.)或super(有效..)显式启动路径来使用相对路径。您需要./sub_sub_module/a_structure,因此Rust中的路径应为self::sub_sub_module::a_structure。完整的编译(带警告)示例如下:

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 s,而不稳定, 是一件事。我想你可以用资源叉或其他东西来考虑它们,我不知道;它只是一个比喻!