我有一个试图开始工作的小程序,但是我一直收到未解决的导入消息。
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
”。我发现的有关可见性的所有内容都表明,此方法应该起作用,但事实并非如此。我在这里想念什么?
将Rust模块想像成目录树。模块是目录,其他都是文件[1]。::
基本上是/
。
因此,您具有以下结构:
/ (crate root)
└┬─ sub_module
│ └┬─ sub_sub_module
│ │ └── a_structure
│ └─ a_structure [x]
├─ a_structure
└─ main
问题在于如何定义a_structure [x]
“符号链接”。正如书中所解释的,use
Rust中的路径是绝对路径,在这种类比中,它们都隐式地以开头/
。这意味着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");
}
您还应该注意,在a之外的任何地方使用的路径use
具有完全相反的默认值:默认情况下,它们是相对于包含模块的。如果你想在这种情况下,绝对路径,则需要通过启动与路径明确要求一个::
(就是这样,是默认文件系统路径,解释为相对)。
除了:常规样式PascalCase
用于类型名称。另外,我还必须删除类型参数,因为它没有被使用。
[1]:实际上,这是一个谎言,因为您可以将项目与其他项目相关联。例如,关联const
s虽然不稳定,但却是一回事。我想您可以从资源分支之类的角度来思考它们,我不知道。这只是一个比喻!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句