似乎我还没有完全了解Rust的模块系统。我具有以下文件结构:
module_issue
|_Cargo.toml
|_src
|_main.rs
|_lib.rs
|_bindings
|_mod.rs
此代码编译并运行没有问题:
// file: bindings/mod.rs
pub fn say_hello() {
println!("Hello from the bindings module!");
}
// file: lib.rs
mod bindings;
pub fn try_bindings() {
bindings::say_hello();
}
// file: main.rs
use module_issue;
fn main() {
module_issue::try_bindings();
}
但是,如果我在lib.rs
中创建一个子模块并尝试从那里使用bindings::say_hello()
,则会出现编译器错误。 lib.rs
现在看起来像这样:
// file: lib.rs
mod bindings;
pub fn try_bindings() {
bindings::say_hello();
}
mod debugging {
pub fn try_bindings_debug() {
bindings::say_hello(); // <- can't find 'bindings' - shouldn't it be in scope?
}
}
这是我得到的错误:
error[E0433]: failed to resolve: use of undeclared type or module `bindings`
--> src\lib.rs:10:9
|
10 | bindings::say_hello();
| ^^^^^^^^ use of undeclared type or module `bindings`
error: aborting due to previous error
在lib.rs
中,我还尝试将mod bindings;
替换为use crate::bindings;
,但这导致了另一个错误:
error[E0432]: unresolved import `crate::bindings`
--> src\lib.rs:2:5
|
2 | use crate::bindings;
| ^^^^^^^^^^^^^^^ no `bindings` in the root
error[E0433]: failed to resolve: use of undeclared type or module `bindings`
--> src\lib.rs:10:9
|
10 | bindings::say_hello();
| ^^^^^^^^ use of undeclared type or module `bindings`
error: aborting due to 2 previous errors
我对模块系统的理解如下:如果将模块A
放入模块B
的范围内,那么A
的公共成员将可以在{{ 1}}和B
的所有子模块。在这种情况下,我将B
模块带入库根目录的范围。 bindings
模块是该根目录的子模块,因此它也应该有权访问debugging
。你能告诉我我哪里出问题了吗?我的首要任务不是真正地解决问题,而是了解为什么这行不通。
我正在使用以下工具链在Windows 10上工作:
bindings
答案 0 :(得分:1)
如果将模块A纳入模块B的范围内,则可以在B和B的所有子模块中访问A的公共成员。
此断言不正确。每个模块的范围仅包含在模块本身中定义或使用的内容,而不是其父对象中的内容。
但是,您可以从父级显式提取项:
mod debugging {
use super::bindings; // referring to library root
pub fn try_bindings_debug() {
bindings::say_hello();
}
}