【问题标题】:Problems with Rust EnumRust 枚举的问题
【发布时间】:2020-01-11 10:01:22
【问题描述】:

我似乎无法让我的匹配表达式工作。看了一下,好像和我看过的其他例子一样。

fn draw(board: BoardType) {
    let board = match board{
        BoardType::B3x3(board, _) => board,
        BoardType::B4x4(board, _) => board
    };
}

#[derive(Debug)]
enum BoardType {
    B3x3([[Space; 3]; 3], (i8, i8)),
    B4x4([[Space; 4]; 4], (i8, i8)),
}

#[derive(Copy, Clone, Debug)]
enum Space {
    Blank,
    X,
    O,
    Blocked,
}
BoardType::B4x4(board,_) => board
                            ^^^^^ expected an array with a fixed size of 3 elements, found one with 4 elements

我真的不明白为什么这不起作用。

【问题讨论】:

  • 你需要匹配 something。应该是match board { ...
  • 也就是说,你仍然不能从你的两个匹配臂返回board,因为它们是不同的类型。但那是另一次了
  • 如果我理解正确的话,我可以用 if let 语法单独处理每一个?
  • 是的。但是我不确定你在draw方法中的目标是什么,所以很难说
  • 我的最终目标是制作一款井字游戏并使用极小极大算法来制作人工智能。我最终希望它能够处理 3 个维度,宽度为 3 和 4。我认为枚举会很合适,因为有 4 种类型的板。现在我不太确定枚举是解决这个特定问题的方法。 print 方法只是应该将当前状态打印到控制台。例如。 “X|O|X”

标签: enums rust pattern-matching


【解决方案1】:

match 表达式返回一个值。即使您没有在此代码中使用该值,编译器也需要对表达式进行类型检查。但是表达式的两个分支具有不同的类型:分别为[[Space; 3]; 3][[Space; 4]; 4]

错误消息告诉您它希望第二个分支与第一个分支具有相同的类型。

您的部分问题可能是您的代码过于简单,实际上并没有做任何事情。假设你有绘制这些板的函数:

fn draw_3x3(board: [[Space; 3]; 3]) {
    unimplemented!()
}

fn draw_4x4(board: [[Space; 4]; 4]) {
    unimplemented!()
}

然后,当您使用它们时,分支将具有相同的类型(()),因此整个表达式将进行类型检查:

fn draw(board: BoardType) {
    let board = match board{
        BoardType::B3x3(board, _) => draw_3x3(board),
        BoardType::B4x4(board, _) => draw_4x4(board),
    };
}

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多