按照 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"),
}
}
这不会编译,它看起来与示例相同,只是重命名了枚举以确保它不与 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
指南遗漏了什么,我错过了什么?在 Rust 0.13 上。
rustc 0.13.0-nightly (fac5a0767 2014-11-26 22:37:06 +0000)
感谢您的帮助。
最佳答案
这不是错误;不久前an RFC on enum variants scoping已实现。现在枚举变体在它们各自的枚举范围内,所以你需要这样写:
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"),
}
}
您可以使用 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"),
}
}
(注意:很快就不需要为 glob 启用功能标志,因为 glob 计划用于 1.0 的稳定)
关于rust - Rust 中未解析的枚举器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307694/