使用模块化位域从 Rust 中的枚举列表创建位域

问题描述

我是 Rust 的新手。作为我的第一个项目,我决定创建一个小库,将国际象棋符号(PGN 和 FEN)转移到尽可能小的空间中。 我目前的实现如下:

mod data {
    use modular_bitfield::{
        BitfieldSpecifier,bitfield,};

    #[derive(BitfieldSpecifier)]
    pub enum Color {
        White,Black,}

    #[derive(BitfieldSpecifier)]
    #[bits=3]
    pub enum Rank {
        Pawn,Knight,Bishop,Rook,Queen,King,None,}

    #[bitfield]
    pub struct Piece {
        rank: Rank,color: Color
    }

    #[bitfield]
    pub struct Board {
        state: [[Piece; 8]; 8]
    }
}

我有两个问题

它给我的第一个错误是没有为类型指定位域:[[Piece; 8]; 8]

第二个是那个结构体必须至少用 8 位来表示(至少这是错误所说的)。但是因为我有一个 N=8*8 的数组,它会占用太多空间。

如果我将 Rank and Piece 更改为:

    #[derive(BitfieldSpecifier)]
    #[bits=3]
    pub enum Rank {
        Pawn(Color),Knight(Color),Bishop(Color),Rook(Color),Queen(Color),King(Color),}

我收到以下错误

error[E0605]: non-primitive cast: `Rank` as `usize`
  --> src/lib.rs:43:9
   |
43 |         None,|         ^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object

另外,如果我给 None 一个颜色,我仍然会得到同样的错误。如果我删除 None 并将一个 Option 类型传递给数组,恐怕它的大小可能会增加,而且我仍然遇到相同的错误:它的特征不满足 [[Option; 8]; 8]

我也尝试过使用元组而不是结构体,但这也无济于事

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)