Невозможно получить перечисление Rust в области видимости в ящике

Примечание редактора: Код в этом вопросе взят из версии Rust до 1.0. Базовая система импорта перечислений была изменена для Rust 1.0.

Кажется, что это должно быть легко (эмуляция перечислений C/C++), но я не могу заставить его работать. Я просто хочу использовать перечисление из ящика, но, похоже, это не сработает, что бы я ни пытался. Я что-то упускаю из перечислений Rust (их нельзя использовать как старые перечисления C/C++)?

Журнал / mod.rs:

pub enum Level {
    Debug,
    Normal,
}

pub struct Log {
    pub log_level: Level,
}

main.rs:

extern crate project;
use project::log::{Log, Level};

fn main() {
    // error: unresolved name `Normal`.
    let logger = Log { log_level: Normal };

    // unresolved name `Level::Normal`.
    let logger = Log { log_level: Level::Normal };

    // unresolved name `log::Level::Normal`.
    let logger = Log { log_level: log::Level::Normal };

    // unresolved name `project::log::Level::Normal`.
    let logger = Log { log_level: project::log::Level::Normal };
}

1 ответ

Решение

Руст 1,0

Варианты Enum теперь расположены под именем enum. Эти два варианта работают как есть:

extern crate project;

use project::log::{Level, Log};

fn main() {
    let logger = Log {
        log_level: Level::Normal,
    };

    let logger = Log {
        log_level: project::log::Level::Normal,
    };
}

Вы также можете импортировать модуль:

extern crate project;

use project::log;

fn main() {
    let logger = log::Log {
        log_level: log::Level::Normal,
    };
}

Или вы можете даже импортировать все варианты enum:

extern crate project;

use project::log::{Log, Level::*};

fn main() {
    let logger = Log {
        log_level: Normal,
    };
}

До Ржавчины 1.0

Вам нужно импортировать каждый вариант перечисления по имени, а не только по имени перечисления, чтобы использовать его неквалифицированное имя. Измените вторую строку в main.rs на

use project::log::{Log, Debug, Normal};

Кроме того, вы можете использовать квалифицированное имя, без Level:: часть пути, поскольку варианты enum не являются пространствами имен, как классы enum C++.

use project::log;
... Log { log_level: log::Normal };
Другие вопросы по тегам