为什么我需要使用额外的 :: 前缀来访问导入的结构?

Why do I need to use an extra `::` prefix to access an imported struct?

在我的 lib.rs 我想做 use std::fs::File.

示例代码如下:

use std::fs::File;
use std::io::Read;

impl Css { 
    pub fn save_result_to_file(file_to_save: String) {
        println!("Saving output to {}", file_to_save);
        let mut f = File::open(file_to_save).expect("Unable to open file");
        // let mut f = ::File::open(file_to_save).expect("Unable to open file"); -> Works
    }
}

如果 File 之前没有 ::,我会遇到编译器错误:

|  let mut f = File::open(file_to_save).expect("Unable to open file");
|                         ^^^^^^^^^^ Use of undeclared type or module `File`

我的问题是 - :: 前缀是否总是必要的?我确定不是,但看不到如何执行此操作。

您可以将 :: 模块路径分隔符视为文件路径中的 /,就像前导 / 表示根目录一样,前导 :: 指的是你的应用程序的根模块。

当您使用 use 导入项目时,该项目的名称实际上成为该模块的(默认情况下私有)成员,并且可以使用绝对或相对路径从其他模块引用。所以你遇到这个问题的事实告诉我你的 use 语句在你的根模块中,而其他代码在子模块中。这就是为什么上面的评论者无法从您实际发布的代码中复制它。

你有这样的模块结构:

use std::fs::File;
use std::io::Read;

mod Foo {
    struct Css {}
    impl Css { 
        pub fn save_result_to_file(file_to_save: String) {
            println!("Saving output to {}", file_to_save);
            let mut f = ::File::open(file_to_save).expect("Unable to open file");
        }
    }
}

前导 :: 是必需的,因为 File 已导入到根模块中,但您正在子模块中使用它。如果您将导入移动到包含您的代码的实际模块中,那么它可以在没有前导 :::

的情况下正常工作
mod Foo {
    use std::fs::File;
    use std::io::Read;

    struct Css {}
    impl Css { 
        pub fn save_result_to_file(file_to_save: String) {
            println!("Saving output to {}", file_to_save);
            let mut f = File::open(file_to_save).expect("Unable to open file");
        }
    }
}