如何将 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"),
};
}
目标:
将 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"),
};
}