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

时间:2017-08-20 19:26:13

标签: rust rust-crates

在我的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`

我的问题是 - ::前缀总是必要的吗?我确定不是,但看不出怎么做。

1 个答案:

答案 0 :(得分:3)

您可以将::模块路径分隔符视为与文件路径中的/相同,而前导/表示根目录,即{{1}指的是你的应用程序的根模块。

导入带有::的项目时,该项目的名称实际上成为该模块的(默认为私有)成员,并且可以使用绝对或相对路径从其他模块引用。因此,您遇到此问题的事实告诉我,您的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的情况下正常工作:

::