Rust中未解析的枚举器名称

dan*_*obo 1 rust

在Rust指南之后,我想运行第8节和第9节中的示例.

enum MOrdering {
    MLess,
    MEqual,
    MGreater,
}

fn cmp(a: int, b: int) -> MOrdering {
    if a < b { MLess }
    else if a > b { MGreater }
    else { MEqual }
}

fn main() {
    let x = 5i;
    let y = 3i;

    match cmp(x, y) {
        MLess => println!("less"),
        MGreater => println!("greater"),
        MEqual => println!("equal"),
    }

}
Run Code Online (Sandbox Code Playgroud)

这不会编译,它似乎与重命名枚举的示例相同,以确保它不与core :: cmp :: Ordering冲突.

这些是我在编译时得到的错误:

rustc src/main.rs
src/main.rs:8:16: 8:21 error: unresolved name `MLess`. Did you mean `a`?
src/main.rs:8     if a < b { MLess }
                             ^~~~~
src/main.rs:9:21: 9:29 error: unresolved name `MGreater`.
src/main.rs:9     else if a > b { MGreater }
                                  ^~~~~~~~
src/main.rs:10:12: 10:18 error: unresolved name `MEqual`. Did you mean `a`?
src/main.rs:10     else { MEqual }
                          ^~~~~~
error: aborting due to 3 previous errors
Run Code Online (Sandbox Code Playgroud)

我错过了指南遗漏了什么?在Rust 0.13上. rustc 0.13.0-nightly (fac5a0767 2014-11-26 22:37:06 +0000)

谢谢您的帮助.

Vla*_*eev 5

这不是一个bug; 不久之前,已经实现了关于枚举变体范围的RFC.现在枚举变体的范围是它们各自的枚举,所以你需要写这个:

enum MOrdering {
    MLess,
    MEqual,
    MGreater,
}

fn cmp(a: int, b: int) -> MOrdering {
    if a < b { MOrdering::MLess }
    else if a > b { MOrdering::MGreater }
    else { MOrdering::MEqual }
}

fn main() {
    let x = 5i;
    let y = 3i;

    match cmp(x, y) {
        MOrdering::MLess => println!("less"),
        MOrdering::MGreater => println!("greater"),
        MOrdering::MEqual => println!("equal"),
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用glob导入恢复旧行为:

#![feature(globs)]

use MOrdering::*;

enum MOrdering {
    MLess,
    MEqual,
    MGreater,
}

fn cmp(a: int, b: int) -> MOrdering {
    if a < b { MLess }
    else if a > b { MGreater }
    else { MEqual }
}

fn main() {
    let x = 5i;
    let y = 3i;

    match cmp(x, y) {
        MLess => println!("less"),
        MGreater => println!("greater"),
        MEqual => println!("equal"),
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:很快就会为globs启用功能标志,因为计划为1.0的稳定计划)