我想将一个Rust程序拆分为多个文件,但使用mod不能从main.rs以外的文件中引用同一目录中的文件.

例如,如果我在同一个文件夹中有main.rsgame.rsmatrix.rs,我可以使用mod game;mod matrix;引用game.rsmatrix.rs in main.rs中的 struct /函数.然而,我不能用像mod matrix这样的语句来引用game.rs中的matrix.rs.

我查看了一些资源,它们都只有一些模块 struct ,比如树,它们之间没有相互引用.是否可以在Rust中使用彼此文件中的 struct /函数,或者这违反了规则?如果是这样,为什么Rust不让你这么做?

推荐答案

mod等于module declaration.该指令声明一个模块及其所有内容.碰巧这些内容可能位于另一个文件中.因此:

mod game;
mod matrix;

大致相当于:

mod game {
    // game.rs contents
}

mod matrix {
    // matrix.rs contents
}

当然,因为mod是一个模块的声明,所以不能对同一个模块多次声明.也就是说,你可以试着写一些

mod game {
    mod matrix;
    ...
}

mod matrix;

但是,正如您所看到的,matrixgame::matrix是不同的模块,当然,如果它们是外部的,rustc需要到各自文件的不同路径.

然而,use等于import declaration.use个声明从其他模块中提取名称,以便在当前模块中使用.你可以在任何可以访问该模块的地方多次从中获取任何模块和任何公共项目.

所以,为了从game中引用matrix,你需要:

// game.rs
use matrix;

自然地,为了使其发挥作用,matrix应该在 crate 根中声明为mod.

作为旁注,我个人认为理解模块系统最简单的方法是首先忘记模块可以放在不同的文件中.也就是说,假设一个 crate 只能在一个文件中定义.在Rust mod指令中,指令可以有主体,也可以嵌套,因此嵌套的mod实际上定义了 crate 的模块系统:

mod foo {
    mod bax {
        ...
    }
    mod baz {
        ...
    }
}
mod bar {
    mod qux {
        mod zux {
            ...
        }
    }
}

如果您只有一个文件,您可以很容易地看到moduse指令是如何工作的,模块之间的关系应该变得清晰.

现在你只需要在图片中添加这样一个事实:如果一个模块被声明为没有主体,比如在mod name;中,它的内容是从name.rsname/mod.rs加载的,不管是什么.然而,整个情况丝毫没有改变——这些仍然是嵌套的模块,可以表示为带有嵌套mod指令的单个源文件.事实上,在外部源文件中的所有模块组装成单个文档后,cargo rustc -Z unstable-options --pretty=normal将以这种形式打印您的 crate .我建议在一些具有复杂模块 struct 的 crate 上运行这个命令,看看它在实践中的效果如何.

Rust相关问答推荐

通用池类型xsx

阻止websocket中断的中断中断的终端(操作系统错误4)

为什么幻影数据不能自动推断?

将PathBuf转换为字符串

如何定义实现同名但返回类型不同的 struct 的函数

为什么TcpListener的文件描述符和生成的TcpStream不同?

如何在嵌套的泛型 struct 中调用泛型方法?

当我try 使用 SKI 演算中的S I I实现递归时,为什么 Rust 会失败?

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

tokio::spawn 有和没有异步块

try 从标准输入获取用户名和密码并删除 \r\n

相当于 Rust 中 C++ 的 std::istringstream

中文优化标题:跳出特定循环并返回一个值

我如何取消转义,在 Rust 中多次转义的字符串?

Rust Redis 中的 HSET 命令问题

将原始可变指针传递给 C FFI 后出现意外值

是否可以在 Rust 中的特定字符上实现特征?

强制特征仅在 Rust 中的给定类型大小上实现

为什么拥有 i32 所有权的函数需要它是可变的?

为什么我可以从读取的可变自引用中移出?