"unresolved import" 使用嵌套模块中的项目时
"unresolved import" when using an item from a nested module
我有一个我一直在尝试运行的小程序,但我一直收到未解决的导入消息。
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
时,我得到一个 "unresolved import 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]
"symlink"。正如书中所解释的,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,虽然不稳定,但 是 的东西。我想你可以从资源叉之类的角度来考虑它们,我不知道;这只是一个比喻!
我有一个我一直在尝试运行的小程序,但我一直收到未解决的导入消息。
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
时,我得到一个 "unresolved import 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]
"symlink"。正如书中所解释的,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,虽然不稳定,但 是 的东西。我想你可以从资源叉之类的角度来考虑它们,我不知道;这只是一个比喻!