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

Mra*_*iih 5 rust

我不明白mod或者use;我想这mod会将文件导入到项目中并use使用它们。

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

.  
|-- Cargo.lock  
|-- Cargo.toml  
|-- src  
|  |-- display.rs  
|  |-- list.rs  
|  |-- main.rs  
|  |-- parser.rs  
|  |-- sort.rs  
Run Code Online (Sandbox Code Playgroud)

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

主程序.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();  
}
Run Code Online (Sandbox Code Playgroud)

列表.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() {

}
Run Code Online (Sandbox Code Playgroud)

排序.rs

pub fn sorting() {

}
Run Code Online (Sandbox Code Playgroud)

显示.rs

pub fn print_files() {

}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

首先,返回并重新阅读modFilesystem。然后再读一遍。无论出于何种原因,许多人都对模块系统遇到了麻烦。《The Rust 编程语言》中包含大量有用的信息。

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

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

use bar避免需要输入 crate 层次结构中某些内容的完整路径。路径从 crate 的根部bar开始。


当你有mod parsermain.rs,你是在说

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

当您尝试添加use parsermain.rs,您是在说

转到层次结构的根部,找到 module parser,并使其在此处(位于板条箱根部)作为 name 可用parser

它已经存在(因为这是定义模块的地方!),因此您会收到错误。

当你有use sortis list.rs时,你是在说

转到层次结构的根部,找到 module sort,并使其在此处(模块内list)可用作为 name sort

这很好用。

1parser/mod.rs

2因为main.rs(或lib.rs)是 crate 根。

也可以看看: