目标:
将EnumMap从enum_map机箱传递到函数
我的错误:
25 | fn print_board(board: &[CellStatus], celldict: & EnumMap<&CellStatus, &str>){
|&CellStatus
未实现特征EnumArray<&str>
相关代码:
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(),
};
}
背景:
我试图制作一个简单的井字游戏作为我的第一个铁锈脚本。我还没有实现游戏的逻辑。我可以通过传递整数和一堆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"),
};
}