一个 crate 被导出但是 "use" 抛出编译错误

A crate is exported but "use" throws compilation errors

在 Cargo 中我有这个:

postgres = "0.11.7"

并且在一个子模块中 *.rs

extern crate postgres;

use postgres::{Connection, Error, FromSql, SslMode};
use postgres::Result as PgResult;

编译错误:

error: unresolved import `postgres::Connection`. Did you mean `self::postgres`? [E0432]
unresolved import `postgres::Error`. Did you mean `self::postgres`? [E0432]

error: unresolved import `postgres::SslMode`. Did you mean `self::postgres`? [E0432]

和类似的。

虽然可以将 extern crate 指令放入任何模块,但将其放入 crate root 更符合习惯也更方便,通常 lib.rsmain.rs。然后你的 use 语句将像现在一样工作。

出现此问题的原因是您将 extern crate postgres 放入了 root crate 的子模块之一:

mod submodule {
    extern crate postgres;

    use postgres::...;
}

这意味着 postgres 模块的完整路径将是 submodule::postgres,而不仅仅是 postgres(请记住,use 指令中的路径默认是绝对路径),因此您应该使用 use submodule::postgres::whatever;use self::postgres::whatever;(后一种形式是 use 语句中相对路径的示例)。但是,正如我之前所说,这不是惯用的,应该避免。