在我的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`
我的问题是 - ::
前缀总是必要的吗?我确定不是,但看不出怎么做。
答案 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
的情况下正常工作:
::