为什么我在子模块中需要"use"语句,而在 main.rs 中不需要?



我不明白moduse;我想mod会将文件导入到项目中,use会使用它们。

我有一个具有此层次结构的项目:

.  
|-- Cargo.lock  
|-- Cargo.toml  
|-- src  
|  |-- display.rs  
|  |-- list.rs  
|  |-- main.rs  
|  |-- parser.rs  
|  |-- sort.rs  

为什么我需要list.rsuse而不是main.rs?我在list.rs中使用函数sorting()print_files(),就像我在 main.rs 中使用函数parse()listing()一样。

main.rs

mod parser;   // Ok
mod list;     // Ok
mod sort;     // Ok
mod display;  // Ok
// use parser;// The name `parser` is defined multiple times
fn main() {  
parser::parse();
list::listing();  
}

list.rs

//mod sort;    // file not found in module `sort`
//mod display; // file not found in module `display`
use sort;      // Ok
use display;   // Ok
pub fn listing() {
parcours_elements();
sort::sorting();
display::print_files();
}
fn parcours_elements() {
}

sort.rs

pub fn sorting() {
}

display.rs

pub fn print_files() {
}

首先,返回并重新阅读mod和文件系统。然后再读一遍。无论出于何种原因,许多人都对模块系统有疑问。Rust 编程语言中包含大量好的信息。

我想mod会将文件导入到项目中,use会使用它们。

mod foo相对于当前模块将一些代码"附加"到 crate 层次结构中。

use bar避免了在板条箱层次结构中键入某些内容的完整路径。路径bar板条箱的根部开始。


当你mod parsermain.rs时,你说的是

找到1parser.rs的文件,并将该文件中的所有代码放在相对于 crate根 2的层次结构中。

当您尝试在main.rs中添加use parser时,您是在说

转到层次结构的根目录,找到模块parser,并在此处(在 crate 根目录(将其作为名称parser提供。

这已经存在(因为那是定义模块的地方!(,所以你会得到一个错误。

当你有use sortlist.rs时,你是在说

转到层次结构的根目录,找到模块sort,并在此处(模块list内(将其作为名称sort提供。

这工作正常。

1 解析器/mod.rs

2 因为main.rs(或lib.rs(是板条箱的根。

另请参阅:

  • 为什么 Rust 中有一个 mod 关键字?
  • 将模块拆分为多个文件
  • 如何包含来自同一项目的另一个文件的模块?

相关内容

最新更新