2016-05-17 4 views
0

В 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] 

И подобные.

+0

Вы разместили 'extern crate postgres;' в 'lib.rs' или' main.rs'? –

ответ

3

Хотя можно поставить extern crate директивы любому модулю, это и более идиоматических и более удобно положить его в клеть корня, обычно lib.rs или main.rs. Тогда ваши use заявления будут работать так, как они есть сейчас.

Причины этой проблемы заключается в том, что вы поставили extern crate postgres одному из подмодулей корня обрешетки:

mod submodule { 
    extern crate postgres; 

    use postgres::...; 
} 

Это означает, что полный путь к postgres модулю будет submodule::postgres, а не только postgres (помните, пути в директивах use по умолчанию абсолютны), поэтому вы должны использовать либо use submodule::postgres::whatever;, либо use self::postgres::whatever; (последняя форма является примером относительных путей в заявке use). Однако, как я уже говорил, это не идиоматично и его следует избегать.

+0

Одно из предостережений здесь заключается в том, что 'use' относится к' root', а другой путь относится к 'self'. Это очень смущает новых желающих. – WiSaGaN

Смежные вопросы