3

编者注:本题中的代码来自 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 };
}
4

1 回答 1

5

锈 1.0

枚举变体现在在枚举名称下命名。这两个选项按原样工作:

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,
    };
}

或者您甚至可以导入所有枚举变体:

extern crate project;

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

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

在 Rust 1.0 之前

您需要按名称导入每个枚举变体,而不仅仅是枚举的名称,以便使用其非限定名称。将 main.rs 中的第二行更改为

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

或者,您可以使用限定名称,而不使用Level::路径部分,因为枚举变体不像 C++ 枚举类那样命名空间。

use project::log;
... Log { log_level: log::Normal };
于 2014-08-20T22:44:06.447 回答