我想写一个函数,将提供的值切换到枚举中的下一个值,并在末尾换行:

enum Direction { NORTH, SOUTH, EAST, WEST }

For example, NORTH => SOUTH, SOUTH => EAST, EAST => WEST, WEST => NORTH.

有没有比手动创建静态数组更简单的方法

use Direction::*;
static DIRECTIONS: [Direction; 4] = [NORTH, SOUTH, EAST, WEST];

枚举不是应该被"枚举"吗?我模糊地记得以前在《铁 rust 》中看到过一个例子,但我似乎找不到它.由于 rust 迹枚举更像联合/变体,我想这会使事情复杂化.

推荐答案

我想像这样的事情会奏效:

#[macro_use]
extern crate num_derive;
extern crate num_traits;

use num_traits::FromPrimitive;

#[derive(Debug, Copy, Clone, FromPrimitive)]
enum Direction {
    NORTH = 0,
    SOUTH,
    EAST,
    WEST,
}

fn turn(d: Direction) -> Direction {
    FromPrimitive::from_u8((d as u8 + 1) % 4).unwrap()
}

fn main() {
    use Direction::*;
    for &d in [NORTH, SOUTH, EAST, WEST].iter() {
        println!("{:?} -> {:?}", d, turn(d));
    }
}

这不需要unsafe,因为它使用自动派生的FromPrimitive特征.

Rust相关问答推荐

包含嵌套 struct 的CSV

为什么类型需要在这个代码中手动指定,在rust?

在函数内定义impl和在函数外定义impl的区别

有没有更好的方法从HashMap的条目初始化 struct ?

使用模块中的所有模块,但不包括特定模块

如何格式化传入Rust中mysql crate的Pool::new的字符串

原始数组数据类型的默认trait实现

在我的Cargo 中,当我在建筑物中使用时,找不到我可以在产品包中使用的 crate .r我如何解决这个问题?

有没有可能让泛型Rust T总是堆分配的?

使用关联类型重写时特征的实现冲突

解析程序无法在Cargo 发布中 Select 依赖版本

应为关联类型,找到类型参数

为什么rustc会自动降级其版本?

如何执行数组文字的编译时串联?

在 Rust 中,在第一个空格上分割字符串一次

返回优化后的标题:返回异步块的闭包的类型擦除

borrow 匹配手臂内部的可变

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

为什么分配对变量的引用使我无法返回它

为什么这个值在上次使用后没有下降?