Rust模块导入库箱中的可见性

时间:2019-12-21 09:57:15

标签: rust

似乎我还没有完全了解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

1 个答案:

答案 0 :(得分:1)

  

如果将模块A纳入模块B的范围内,则可以在B和B的所有子模块中访问A的公共成员。

此断言不正确。每个模块的范围仅包含在模块本身中定义或使用的内容,而不是其父对象中的内容。

但是,您可以从父级显式提取项:

mod debugging {
    use super::bindings; // referring to library root
    pub fn try_bindings_debug() {
        bindings::say_hello();
    }
}

Playground