2

我有一个小程序,我一直在尝试开始工作,但我不断收到未解决的导入消息。

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”。我发现的有关可见性的所有内容都表明这应该可以工作,但不能。我在这里想念什么?

4

1 回答 1

3

把 Rust 模块想象成一个目录树。模块是目录,其他一切都是文件 [1]。 ::基本上是/

所以,你有这个结构:

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

问题在于您如何定义a_structure [x]“符号链接”。正如书中所解释的,useRust 中的路径是绝对的,这意味着在这个类比中它们隐含地以 开头/。意思use sub_sub_module::a_structure是指的/sub_sub_module/a_structure不存在的。

self解决方案是通过显式以(effectively .) 或super( Effectively )开头的路径来使用相对路径..。你想要./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");
}

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

旁白:常规样式是PascalCase用于类型名称。此外,我不得不删除类型参数,因为它没有被使用。


[1]:这实际上是一个谎言,因为您可以将项目与其他项目相关联。例如,关联const的 s 虽然不稳定,但它是一个东西。我想您可以从资源分叉或其他方面来考虑它们,我不知道;这只是一个比喻!

于 2016-03-26T01:56:27.640 回答