1

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

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

4

1 回答 1

3

您可以将::模块路径分隔符视为与文件路径相同的方式/,就像前导/表示根目录一样,前导表示::应用程序的根模块。

当您导入一个项目时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");
        }
    }
}
于 2017-08-20T19:49:00.653 回答