使用 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 没有像 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::*;