Rust书籍12.3 - 未解决的导入错误[E4032]

18

我刚接触Rust,在该书第12.3章节中的练习上工作。

虽然由于“snips”的缘故很难确定,但我相当自信我的代码与书中一致。 然而,当我尝试从项目目录minigrep/运行cargo buildcargo run时,会出现未解决的导入错误。

src/main.rs

use std::env;
use std::process;

use minigrep;
use minigrep::Config;

fn main() {
    let args: Vec<String> = env::args().collect();

    let config = Config::new(&args).unwrap_or_else(|err| {
        println!("Problem parsing args: {}", err);
        process::exit(1);
    });

    println!("Searching for {}", config.query);
    println!("In file {}", config.filename);

    if let Err(e) = minigrep::run(config) {
         println!("Application error: {}", e);

         process::exit(1);
    }
}

src/lib.rs

:源代码文件路径。
use std::fs;
use std::error::Error;

pub struct Config {
    pub query: String,
    pub filename: String,
}

impl Config {
    pub fn new(args: &[String]) -> Result <Config, &'static str> {
        if args.len() < 3 {
            return Err("not enough args");
        }

        let query = args[1].clone();
        let filename = args[2].clone();

        Ok(Config { query, filename })
    }
}

pub fn run(config: Config) -> Result<(), Box<dyn Error>> {

    let contents = fs::read_to_string(config.filename)?;

    println!("With text:\n {}", contents);

    Ok(())

}

6
我遇到了同样的问题。我使用VS Code进行编辑、构建和通过命令行使用cargo执行。我无法在编辑器中消除错误,但是我能够使用cargo构建和运行,没有任何问题。所以我退出了VS Code并重新启动它。这解决了问题,因为VS Code不再显示该错误。 - Mark
5个回答

33
在第12.3章的练习代码示例和第7章早期部分“7.2 - 模块和使用控制范围 - 将模块分离到不同文件中”之间存在矛盾。
使用7.2的语法符合要求:
mod lib; //.. instead of 'use minigrep'
use lib::Config; //.. instead of 'use minigrep::Config'

1
这个解决方法不必要。请按照Tyler Brock的下面的答案。它对我有用。 - Sibaprasad Maiti

7

以上两个答案都不正确。使用 cargo clean 是正确的解决方案。在IDE中产生红色下划线的增量构建过程是关于程序和库的缓存信息的结果。

$ cargo clean

2
这确实是正确的。我遇到了同样的问题,这个解决方案起作用了。同时,我也认为上面的解决方案看起来像是一种变通方法而不是真正的解决方案。 - Sibaprasad Maiti
1
这是正确的答案。请更新被接受的答案或者给这个人点赞。 - Mohana Sundaram S

4

0

我遇到了这个问题,因为我不小心选择了错误的lib.rs文件名。确保文件名为lib.rs没有拼写错误。其他文件名在这里不起作用,因为有use语句。

当你写use minigrep::Config时,编译器会在当前项目minigrep中查找lib.rs文件来解析导入。


-1

我在阅读《Rust编程语言》时遇到了同样的问题。我让它编译通过的方法是从src/main.rs中删除use minigrep;这一行,并在文件顶部添加extern crate minigrep。其他文件可以保持不变。不确定这是否是书中的笔误(如果是,则在多个版本中都有),还是Rust编译器的行为发生了变化以适应新的语法,而我们只是使用了一个过时的版本。与我的版本1.31.0进行比较。


1
我刚刚找到了问题所在。为了让代码像教程中展示的那样工作,你必须确保你的项目处于“2018”模式下。在 Cargo.toml 文件的 package 部分中加入 edition = "2018"。1.31.0 版本会在创建新项目时自动执行此操作,但我在从 1.30.0 更新到 1.31.0 之前已经创建了我的项目。 - Giancarlo DiMino
是的,我看到了相同的行为。同时,新建的项目默认使用版本“0.1.0”,这可能是我的问题原因。谢谢! - tbarnes
当我在寻找解决方案时,发现你的帖子是唯一没有回复的。当我的代码开始编译时,我想分享我的经验。很高兴我能帮到你。 - Giancarlo DiMino
另外,只是让您知道。您看到的版本是所有新项目的默认版本。这在新的货箱上始终相同,与 Rust 的版本无关。要获取 Rust 版本,请在命令行上运行以下命令:rustc --version - Giancarlo DiMino
1
这个答案中的任何解决方案似乎都不再适用。用户11090888提供的另一个答案使用mod lib; use lib :: Config:似乎是正确的,与其他文档一致并且实际有效。 - Chuck
这个解决方案已经无法与rustc编译器1.51.0版本一起使用了。请将user11090888的答案提升为最佳答案。 - Tudor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接