在 Rust 中,有没有一种方法可以对枚举成员进行“分组”,以便我可以获得谓词函数并在匹配语句中使用该谓词?
假设我有这个枚举:
enum Number {
One,
Two,
Three,
Four,
Five,
Six
}
这个谓词:
impl Number {
fn is_prime(&self) -> bool {
self == Number::Two || self == Number::Three || self == Number::Five
}
}
然后我的问题是,我的代码库周围有几个匹配语句,如果数字是素数,它们会以不同的方式处理事情:
match number {
Number::Two | Number::Three | Number::Five => {/* do something for primes*/}
Number::One => ...
Number::Four => ...
Number::Six => ...
}
我只想知道什么是素数的真相来源。当然,我可以在每个匹配语句之前添加谓词检查:
if number.is_prime() {
/* do something for primes*/
} else {
match number {
Number::One => ...
Number::Four => ...
Number::Six => ...
_ => {} // should never happen
}
}
但是后来我失去了详尽性检查。我需要添加一个包罗万象的手臂,它不能为我提供编译安全性,以确保后来将成员添加到
Number
的任何人都必须在每个 match
语句中显式处理它。
理想情况下我想做这样的事情:
match number {
is_prime() => {/* do something for primes*/}
Number::One => ...
Number::Four => ...
Number::Six => ...
}
有没有办法达到同样的目标?我想应该有一种方法可以通过宏来做到这一点,但我尽量避免使用宏,因为它们使代码不那么明确。
听起来您正在寻找比赛后卫。
match number {
num if num.is_prime() => {/* do something for primes*/}
Number::One => ...
Number::Four => ...
Number::Six => ...
}