如何在Rust中匹配标志/位掩码?

7

让我们以位标志的典型检查为例:

if      (v & (1 << 0)) != 0 { foo(); }
else if (v & (1 << 1)) != 0 { bar(); }
else if (v & (1 << 2)) != 0 { baz(); }

这句话如何用match语句来写?

你是不是想说 if v & (1 << 0) > 0 等等? - Dogbert
@Dogbert,是的,已更新。 - ideasman42
我认为在测试单个位时使用match没有意义。 - starblue
1个回答

13
if      (v & (1 << 0)) != 0 { foo(); }
else if (v & (1 << 1)) != 0 { bar(); }
else if (v & (1 << 2)) != 0 { baz(); }

这样的具体代码可以重写为:

match v.trailing_zeros() {
    0 => foo(),
    1 => bar(),
    2 => baz(),
    _ => {},
}

1
真聪明!我编写了一些测试来验证这确实是正确的(它们通过了):https://play.rust-lang.org/?gist=bcbd5fb07635e0601747abf06b8d3f57&version=stable&backtrace=0 - Dogbert
1
生成的代码是否与位掩码检查一样高效? - ideasman42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接