我有一个小程序,我一直在尝试使其工作,但我不断收到 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/