使用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++的“部分名称空间”?如果这样的事情是不可能的,我应该如何组织我的数据结构和功能?
1条答案
按热度按时间wko9yo5t1#
Rust没有像C++的命名空间那样的机制。
Rust的模块是组织代码的方式,但它们不做任何类型的自动合并。如果你想要更多的嵌套文件,但在一个平坦的路径中访问它们,那么你可以从子模块重新导出项目到父模块。
愚蠢的例子:
如果您正在使用
main.rs
编写代码,并且不想指定plants::trees::Pine
,而是希望plants::Pine
可以工作。字符串
然后,您可以将
plants::trees
中的所有内容重新导出到mod.rs
中的plants
中:型