我如何以纯净的方式将bool比较和'if let'语句混合在一起

问题描述 投票:1回答:1

我正在编写一个函数,该函数依赖于比较布尔值,还使用'if let'语法检查枚举的类型。有没有比我下面更干净的方法?

    fn is_mine(&self, row: i32, col: i32) -> bool {
        if self.bounds.is_in_bounds(row, col) {
            if let MineCell::Mine = self.field[row as usize][col as usize] {
                return true;
            }
        }

        false
    }

这基本上是可行的,但是它通过返回true / false作为'if'块内的唯一语句来“感觉”肮脏。在我的情况下,必须首先在.is_in_bounds()成员中进行布尔比较,然后可以安全地对枚举类型进行'if let'检查。

我的意思是从技术上讲这是正确的,但是我觉得必须有一种更惯用的方式来防止生锈。我在这里和其他地方都看到过有关如何正确堆叠'if let'语句的帖子,但是没有关于混合bool比较和'if let'比较的内容。

任何想法,还是我应该接受上述代码的正确但难看的形式?

rust
1个回答
0
投票

您可以使用std::mem::discriminant在单个表达式中执行此操作:

std::mem::discriminant

[请记住,在Rust中,逻辑运算符会短路,因此,只有在第一部分为true时,才会执行use std::mem::discriminant; fn is_mine (&self, row: i32, col: i32) -> bool { self.bounds.is_in_bounds (row, col) && discriminant (self.field[row as usize][col as usize]) == discriminant (MineCell::Mine) } 之后的部分。

© www.soinside.com 2019 - 2024. All rights reserved.