我正在编写一个函数,该函数依赖于比较布尔值,还使用'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'比较的内容。
任何想法,还是我应该接受上述代码的正确但难看的形式?
您可以使用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)
}
之后的部分。