3

編集者注: この質問のコードは、1.0 より前のバージョンの Rust のものです。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

列挙型のバリアントは、列挙型名で名前空間化されるようになりました。これら 2 つのオプションはそのまま機能します。

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 の 2 行目を次のように変更します。

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

または、パスの一部を省略して修飾名を使用することもできます。これはLevel::、enum バリアントは C++ enum クラスのように名前空間化されていないためです。

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