Rust 相当于 C++ 命名空间?

问题描述 投票:0回答:1

使用 C++ 命名空间,我可以将任何文件中的任何内容放入任何位置,并且在编译时它们将“合并”到单个命名空间中。因此,这个文件结构:

/* src/main.cpp */
int main() {
    nsfoo::foo();
}
/******/

/* src/foo/function.cpp */
namespace foo {
    void foo(nsfoothing thing) {}
}
/******/

/* src/foo/structures.cpp */
namespace foo {
    struct nsfoothing {};

    void nsfooprocessthing(nsfoothing thing) {}
}
/******/

相当于拥有一个包含以下内容的文件:

/* src/main.cpp */
namespace nsfoo {
    struct nsfoothing {};
    void foo(nsfoothing thing) {}
    void nsfooprocessthing(nsfoothing thing) {}
}

int main() {
    nsfoo::foo();
}
/******/

或者这个文件结构:

/* src/main.cpp */
int main() {
    nsfoo:foo();
}
/******/

/* src/foo/foo.cpp */
namespace nsfoo {
    struct nsfoothing {};
    void foo(nsfoothing thing);
    void processnsfoothing(nsfoothing thing);
}
/******/

或这个文件:

/* tmp/quickndirtytesting.cpp */
namespace foo {
    struct nsfoothing {};
}

namespace foo {
    void foo(nsfoothing thing) {}
    void processnsfoothing(nsfoothing thing) {}
}

int main() {
    nsfoo::foo();
}
/******/

重点是,对于我如何布局我的“模块”,以及我将什么放在什么文件中,基本上没有任何限制 - 它们在编译时都会“合并”。

使用 Rust,我尝试翻译一个应该在 C++ 中工作的东西:

/* src/main.rs */
mod mymod {
    struct Foo {}
}

mod mymod { // <-- the name `mymod` is defined multiple times. `mymod` must be defined only once in the type namespace of this module.
    struct Bar {}
}

fn main() {
    // Would reference mymod here, but it produced an error before I even get here.
}
/******/

并且很快发现我使用 C++ 命名空间“将任何内容放置在任何文件结构中的任何位置”的经验在 Rust 中并不完全一样。理想情况下,我希望有一个类似于 C++ 中的结构:

.
└── src
    ├── main.rs
    └── mymod
        ├── agroupoffunctions.rs
        ├── structures.rs
        └── yetanothergroupoffunctions.rs

所以我想我的问题是,如何在 Rust 中创建“部分命名空间”,类似于 C++?如果这样的事情不可能,我应该如何组织我的数据结构和功能?

rust module namespaces
1个回答
0
投票

Rust 没有像 C++ 的命名空间那样的机制。

Rust 的模块是组织代码的方式,但它们不进行任何类型的自动合并。如果您想要更多嵌套文件但以更平坦的路径访问它们,那么您可以将子模块中的项目重新导出到父模块中。


愚蠢的例子:

如果您在

main.rs
中编写代码并且不想指定
plants::trees::Pine
,而是希望
plants::Pine
能够工作。

src/
- main.rs
- plants/
  - mod.rs
  - trees/
    - ...
  - ferns/
    - ...
  - grasses/
    - ...

然后您可以将

plants::trees
中的所有内容重新导出到
plants
中的
mod.rs
:

mod trees;
mod ferns;
mod grasses;

pub use trees::*; // <-- re-exports everything
pub use ferns::*;
pub use grasses::*;
© www.soinside.com 2019 - 2024. All rights reserved.