如何将结构的实现移动到单独的文件中而不将其放入子模块中?

pid*_*pid 2 rust

我有这个主要功能:

mod tools;

fn main() {

    let mut factory = tools::TerminalFactory::new();
    let trm: tools::Terminal;

    trm = factory.create("TTY1".to_string());
    println!("{}", trm);

    std::process::exit(0);
}
Run Code Online (Sandbox Code Playgroud)

这是tools/mod.rs

pub struct Terminal {
    id: u32,
    pub name: String
}

impl Terminal {
    pub fn get_id(self: &Self) -> u32 {
        self.id
    }
}

impl std::fmt::Display for Terminal {
    fn fmt(self: &Self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "TERMINAL#{} ({})", self.id, self.name)
    }
}

pub struct TerminalFactory {
    next_id: u32
}

impl TerminalFactory {
    pub fn new() -> TerminalFactory {
        TerminalFactory {
            next_id: 0
        }
    }

    pub fn create(self: &mut Self, name: String) -> Terminal {
        self.next_id += 1;

        Terminal {
            id: self.next_id,
            name: name
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我必须在tools:tools::TerminalFactorytools::Terminal. 我想要做的是在两个单独的文件中实现这两个结构,因为tools模块会非常拥挤,我不想用数千行代码来混乱它。

我无法想出一种方法来将此代码移动到单独的文件并将其保存在tools. 当我将它移动到其他文件时,我得到的是,tools/mod.rs我必须定义mod

mod TerminalFactory;
mod Terminal;
Run Code Online (Sandbox Code Playgroud)

但这会将结构移动tools::TerminalFactory::TerminalFactoryand tools::Terminal::Terminal,这不是我想要的。

这是如何在没有货物和没有货物的情况下以质朴的方式完成的*.toml

我肯定会使用cargo,但我想事先了解没有它如何做到这一点。

Den*_*ret 5

当您不想公开这种模块化结构时,您通常会重新导出更深的类型。

在这里,您的 tools/mod.rs 文件将是

mod TerminalFactory;
mod Terminal;

pub use {
    Terminal::Terminal,
    TerminalFactory::TerminalFactory,
};

Run Code Online (Sandbox Code Playgroud)

pub use使外部代码能够使用该TerminalFactory类型,就像它是在上层模块中声明的一样。