将结构移动到一个单独的文件而不拆分成一个单独的模块?

Move struct into a separate file without splitting into a separate module?

我有这个文件层次结构:

main.rs
protocol/
protocol/mod.rs
protocol/struct.rs

struct.rs中:

pub struct Struct {
    members: i8
}

impl Struct {
    pub fn new() -> Struct {
        Struct { 4 }
    }
}

如何访问它:

mod protocol;
protocol::Struct::new();
// As opposed to:
// protocol::struct::Struct::new();

我已经尝试了 pub usemod 的各种组合,但不可否认我是在盲目地探索事物。

是否可以将一个结构(它是 impl)拆分为一个单独的文件而无需创建新的 mod?

简短的回答:在 mod.rs 中使用 pub use Type。完整示例如下:

我的结构:

src/
├── main.rs
├── protocol
│   └── thing.rs
└── protocol.rs

main.rs

mod protocol;

fn main() {
    let a = protocol::Thing::new();
    println!("Hello, {:?}", a);
}

protocol.rs

pub use self::thing::Thing;
mod thing;

protocol/thing.rs

#[derive(Debug)]
pub struct Thing(i8);

impl Thing {
    pub fn new() -> Thing { Thing(4) }
}

作为内务管理位,不要将文件称为语言关键字。 struct导致编译有问题,所以改名了。另外,你的结构创建语法不正确,所以我为这个例子选择了较短的版本^_^。

并回答您标题中提出的问题:如果不使用深奥的功能,文件总是会创建一个新模块 — 您 不能 将某些内容放入不同的文件中把它放在不同的模块中。您可以 re-export 类型,但它看起来不像。

进一步解释:mod 关键字告诉编译器查找具有该名称的文件,并从当前文件中将其作为模块引用。例如,mod protocol; 将查找文件 protocol.rs 并表现得好像它包含了它的内容,类似于:

mod protocol {
    // ... contents here
};

有关详细信息,请参阅 Rust by Example

mod.rs:

src/
├── main.rs
└── protocol
    ├── mod.rs
    └── thing.rs

protocol/thing.rs

pub struct Struct {
    members: i8
}

impl Struct {
    pub fn new() -> Struct {
        Struct { members: 4 }
    }
}

protocol/mod.rs

pub mod thing;

main.rs

mod protocol;

fn main() {
    protocol::thing::Struct::new();
}