如何将 EnumMap 传递给函数?

How do I pass an EnumMap to a function?

目标:
将 EnumMap 从 enum_map crate 传递给函数

我的错误:

25 | fn print_board(board: &[CellStatus], celldict: & EnumMap<&CellStatus, &str>){
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ 特征 EnumArray<&str> 没有为 &CellStatus

实现

相关代码:

use enum_map::{enum_map, EnumMap};

enum CellStatus{
    Empty,
    Cross,
    Circle,
}

fn print_board(board: &[CellStatus], celldict: & EnumMap<&CellStatus, &str>){
    for cell in board {
        println!("{}", celldict[cell]);

    }
}



fn main() {


    let cell_repr = enum_map! {
        CellStatus::Empty  => " _ ".to_string(),
        CellStatus::Cross  => " X ".to_string(),
        CellStatus::Circle => " O ".to_string(),
    };


}

背景:

我正在尝试制作一个简单的井字游戏作为我的第一个 Rust 脚本。我还没有实现游戏的逻辑。我可以通过传递整数和一堆 if 语句来让它工作,但我想以更干净的方式编写它。

我想我必须为我的枚举实现一些东西?但我不确定该怎么做。

完整代码:https://pastebin.com/pZwqyvR2
有问题的板条箱:https://docs.rs/enum-map/latest/enum_map/#

根据您发布的文档,您必须 derive 板条箱的特性才能在 enum 上使用 enum_map!。唯一的修改就在您的 enum 定义之前:

#[derive(Enum)]
enum CellStatus {
  Empty,
  Cross,
  Circle,
}

此外,enum_map! 的结果在您的情况下是 EnumMap<CellStatus, String>,而不是 EnumMap<&CellStatus, &str>,更改为该类型应该会有所帮助。它抱怨 &CellStatus 没有实现某个特性,因为该特性是由 CellStatus 的派生宏自动实现的,而不是 &CellStatus。然而,如果你这样做它仍然不会编译,因为 EnumMap 没有实现 Index<&CellStatus>,而只实现 Index<CellStatus>(如果你问我这有点愚蠢)。无论如何,修补此 IMO 的最佳方法是制作 CellStatus Copy。以下编译:

use enum_map::{enum_map, Enum, EnumMap};

#[derive(Enum, Clone, Copy)]
enum CellStatus {
    Empty,
    Cross,
    Circle,
}

fn print_board(board: &[CellStatus], celldict: &EnumMap<CellStatus, String>){
    for cell in board {
        println!("{}", celldict[*cell]);

    }
}

fn main() {
    let cell_repr = enum_map! {
        CellStatus::Empty => String::from("_"),
        CellStatus::Cross => String::from("X"),
        CellStatus::Circle => String::from("O"),
    };
}