是否可以在Rust中的不同源文件中使用模块

Val*_*yev 1 rust rust-crates rust-cargo

这实际上是一个两部分问题:

  1. 我可以在Rust的单独文件中使用单个模块吗?

在此输入图像描述

这是我的文件布局.是否有可能有一个单独的logging模块,并有一组结构/性状被这个模块内部定义的,但在不同的物理文件(记录器,SQL)?

如果可能的话,这样的项目可以用当前货物建造吗?

并且,如果可能,我如何logging在我的app.rs中引用模块中定义的结构?

我正在使用:rustc 0.12.0-pre-nightly(cf1381c1d 2014-07-26 00:46:16 +0000)

A.B*_*.B. 11

严格地说,您不能将一个模块拆分为不同的文件,但您不需要将子模块定义为类似的效果(这也是一个更好的解决方案).

你可以这样安排你的模块:

src/app.rs
src/logging/mod.rs // parent modules go into their own folder
src/logging/logger.rs // child modules can stay with their parent
src/logging/sql.rs
Run Code Online (Sandbox Code Playgroud)

以下是文件的外观

SRC/app.rs

mod logging;

pub struct App;

fn main() {
    let a = logging::Logger; // Ok
    let b = logging::Sql; // Error: didn't re-export Sql
}
Run Code Online (Sandbox Code Playgroud)

SRC /记录/ mod.rs

// `pub use ` re-exports these names
//  This allows app.rs or other modules to import them.
pub use self::logger::{Logger, LoggerTrait};
use self::sql::{Sql, SqlTrait};
use super::App; // imports App from the parent.

mod logger;
mod sql;

fn test() {
    let a = Logger; // Ok
    let b = Sql; // Ok
}

struct Foo;

// Ok
impl SqlTrait for Foo {
    fn sql(&mut self, what: &str) {}
}
Run Code Online (Sandbox Code Playgroud)

SRC /记录/ logger.rs

pub struct Logger;

pub trait LoggerTrait {
    fn log(&mut self, &str);
}
Run Code Online (Sandbox Code Playgroud)

SRC /记录/ sql.rs

pub struct Sql;

pub trait SqlTrait {
    fn sql(&mut self, &str);
}
Run Code Online (Sandbox Code Playgroud)

  • 实际上,您可以将单个模块拆分为多个文件,包括!("其他文件的路径").但是,它非常好地建议您像AB一样说,并将它们拆分为单独的模块,并在使用pub时重新导出它们. (2认同)