我有一个小程序,我一直在努力工作,但我总是收到未解决的导入消息。
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”。我发现的所有关于可视性的东西都说,这应该是可行的,但是它不起作用。我在这里遗漏了什么?
发布于 2016-03-26 01:56:27
把锈蚀模块想象成一个目录树。模块是目录,其他的都是文件1,::基本上是/。
所以,你有这样的结构:
/ (crate root)
└┬─ sub_module
│ └┬─ sub_sub_module
│ │ └── a_structure
│ └─ a_structure [x]
├─ a_structure
└─ main问题在于如何定义a_structure [x]“符号链接”。正如书中所解释的, paths in Rust are absolute,这意味着在这个类比中,它们都隐式地以/开头。这意味着use sub_sub_module::a_structure指的是不存在的/sub_sub_module/a_structure。
解决方案是通过显式地使用self (有效的.)或super (有效的..)启动路径来使用相对路径。您需要./sub_sub_module/a_structure,所以锈蚀中的路径应该是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作为类型名称。另外,我不得不删除类型参数,因为它没有被使用。
他说:事实上,这是一个谎言,因为你可以拥有与其他物品相关的物品。例如,关联的const虽然不稳定,但却是一回事。我想你可以从资源叉之类的角度来看待它们,我不知道,这只是个比喻!
https://stackoverflow.com/questions/36230543
复制相似问题