Невозможно найти символы из внешних ящиков, включенных в `use`

Я пытаюсь использовать некоторые библиотеки Rust из ящиков на Github. Это первый раз, когда я пытался это сделать. Код, взятый из примера библиотеки "html", начинается так:

mod interactive_test {
    extern crate http;
    extern crate url;
    use std::os;
    use std::str;
    use url::Url;

    use http::client::RequestWriter;
    use http::method::Get;
    use http::headers::HeaderEnum;
    // ...
}

fn main() {}

Ошибки выглядят так:

error[E0432]: unresolved import `url::Url`
 --> src/main.rs:7:9
  |
7 |     use url::Url;
  |         ^^^^^^^^ Did you mean `self::url`?

error[E0432]: unresolved import `http::client::RequestWriter`
 --> src/main.rs:9:9
  |
9 |     use http::client::RequestWriter;
  |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?

error[E0432]: unresolved import `http::method::Get`
  --> src/main.rs:10:9
   |
10 |     use http::method::Get;
   |         ^^^^^^^^^^^^^^^^^ Did you mean `self::http::method`?

error[E0432]: unresolved import `http::headers::HeaderEnum`
  --> src/main.rs:11:9
   |
11 |     use http::headers::HeaderEnum;
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^ Did you mean `interactive_test::http`?

Cargo.toml файл содержит

[dependencies.http]
http = "https://github.com/chris-morgan/rust-http"

[dependencies.url]
url = "0.2.7"

и пакеты HTTP и URL были найдены и получены cargo build ранее.

extern crate http а также extern crate url строки не генерируют ошибок; ящики находят компилятор, но эти ящики не содержат ожидаемых символов. Если я добавлю "extern crate foo", я получу ошибку, так что это проверено.

Это, вероятно, некоторая проблема с поиском библиотек в Rust или Cargo. Ржавчина установлена ​​в ~/local, а не как root, сделано путем установки --prefix параметр во время установки. Это могло что-то сломать, хотя Cargo должен справиться с этим. Основные вещи вроде "hello_world" работают отлично; внесение во внешние библиотеки не дает.

Я замечаю что cargo update не вызывает повторную загрузку ящиков http и url с Github. В документации указано, что должно.

Версии:

  • Ubuntu 14.04 LTS.
  • rustc 0.13.0-nightly (96a3c7c6a 2014-12-23 22:21:10 +0000)
  • грузы 0.0.1-pre-nightly (e11c317 2014-12-21 20:43:45 +0000)

1 ответ

Компилятор дал вам ответ, который вам нужен.

Ваш extern crate операторы находятся внутри модуля, и use заявления требуют абсолютных путей. То есть когда ты говоришь use url::Url; внутри interactive_test модуль, что вы на самом деле говорите "использовать url::Url который определен в корневом модуле ", а это не так.

Что вам нужно сделать, это префикс пути с self:: сказать это посмотреть в текущем модуле. Вы также можете использовать super:: чтобы получить доступ к родительскому модулю (если он когда-либо появится).

Лично я обхожу это, помещая все свои extern crate операторы в корневом модуле, который также служит своего рода программным списком используемых внешних ящиков.

Другие вопросы по тегам