Jak*_*lat 5 bitwise-operators rust
我有一个变量,它由几个标志 ORed 组成,我想测试我的值是它们的哪个组合并对其采取行动。不幸的是,|运算符在match语句中具有不同的含义,所以我不能写
match x {
(FLAG1 | FLAG2) => return 5;
(FLAG1 | FLAG3) => return 6;
(FLAG2 | FLAG3) => return y;
_ => return 0;
}
Run Code Online (Sandbox Code Playgroud)
相反,我需要预先计算(FLAG1 | FLAG2)等等,使我的代码变得丑陋且不可读。有一个更好的方法吗?
match表达式每个臂的左侧部分是一个模式而不是一个表达式。这意味着您只能在那里进行模式匹配。您不能使用运算符、访问器和函数调用。
不幸的是,我认为您可能会坚持执行以下操作if..else:
if x == FLAG1 | FLAG2 { return 5 }
else if x == FLAG1 | FLAG2 { return 6 }
else if x == FLAG1 | FLAG2 { return y }
else { return 0 };
Run Code Online (Sandbox Code Playgroud)
但是,由于if..else(和match) 是表达式,您至少可以消除重复的return:
return if x == FLAG1 | FLAG2 { 5 }
else if x == FLAG1 | FLAG2 { 6 }
else if x == FLAG1 | FLAG2 { y }
else { 0 };
Run Code Online (Sandbox Code Playgroud)
您可以通过使用一系列可能的选项来解决此限制:
const FLAG1: usize = 1;
const FLAG2: usize = 2;
const FLAG3: usize = 3;
fn main() {
let x = 1;
let y = 10;
let options = [
(FLAG1 | FLAG2, 5),
(FLAG1 | FLAG3, 6),
(FLAG2 | FLAG3, y)
];
let result = options.iter()
.find(|(calc, _)| *calc == x)
.map(|(_, ret)| *ret)
.unwrap_or(0);
}
Run Code Online (Sandbox Code Playgroud)
根据您想要涵盖的变体数量,这可能是一个可行的解决方案。
| 归档时间: |
|
| 查看次数: |
703 次 |
| 最近记录: |