我有这样的文件层次 struct :

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();

我try 过pubusemod的各种组合,但不可否认,我是在盲目地戳东西.

有没有可能在不创建新mod的情况下将一个struct(它是impl)拆分成一个单独的文件?

推荐答案

简单的回答是:在mod.rs中使用pub use Type.下面是一个完整的例子:

我的 struct :

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导致编译问题,所以我重新命名了它.此外,您的 struct 创建语法不正确,因此我为本例 Select 了较短的版本^ ^.

为了回答你在标题中提出的问题:如果不使用深奥的功能,一个文件总是会创建一个新模块——你可以将某个内容放入不同的文件中,而不必将其放入不同的模块中.您可以重新导出该类型,使其看起来不那么像.

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

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

更多细节见Rust by Example.

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

如何从铁 rust 中呼唤_mm_256_mul_ph?

为什么BitVec缺少Serialize trait?

是否可以使用Rust宏来构建元组的项?

如何在不调用Collect()的情况下为新型vec实现IntoIterator?

在Rust 中移动原始指针的靶子安全吗

在macro_rule中拆分模块和函数名

减少指示ProgressBar在Rust中的开销

确保参数是编译时定义的字符串文字

如何重命名 clap_derive 中的子命令占位符?

使用占位符获取用户输入

缺失serde的字段无法设置为默认值

为什么Rust编译器会忽略模板参数应具有静态生命周期?

Rust与_有何区别?

Rust,使用枚举从 HashMap 获取值

在 Rust 中为泛型 struct 编写一次特征绑定

用逗号分隔字符串,但在标记中使用逗号

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?

当引用不再被borrow 时,Rust 不会得到它

如何在宏中的多个参数上编写嵌套循环?