Rust是否等同于C++命名空间?

zd287kbt  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(123)

使用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++的“部分名称空间”?如果这样的事情是不可能的,我应该如何组织我的数据结构和功能?

wko9yo5t

wko9yo5t1#

Rust没有像C++的命名空间那样的机制。
Rust的模块是组织代码的方式,但它们不做任何类型的自动合并。如果你想要更多的嵌套文件,但在一个平坦的路径中访问它们,那么你可以从子模块重新导出项目到父模块。
愚蠢的例子:
如果您正在使用main.rs编写代码,并且不想指定plants::trees::Pine,而是希望plants::Pine可以工作。

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

字符串
然后,您可以将plants::trees中的所有内容重新导出到mod.rs中的plants中:

mod trees;
mod ferns;
mod grasses;

pub use trees::*; // <-- re-exports everything
pub use ferns::*;
pub use grasses::*;

相关问题