使用在运行时计算的值作为匹配模式之一的最佳方法是什么?
我有一个值(byte
),我需要与其他值匹配。一些值是固定的(b'0'.. b'9')。其他的是在运行时计算的(c = some_function()
)。
我目前的解决方案是使用假变量和if保护(即k if (k == c)
),但它对我来说看起来不太好。我尝试只使用c
但是它被解释为一个全能变量,而不是在该上下文中替换c
的值。
以下代码段显示了问题:(also on playpen)
fn main() {
fun(b'5', 0);
fun(b'C', 0);
fun(b'C', 2);
}
fn fun(byte: u8, i: uint) {
let CHARS = b"ABCDEFGH";
let c = CHARS[i];
let msg = match byte {
b'0'..b'9' => "numeric",
// c => "same char", // <-- I would had preferred this
k if (k == c) => "same char",
_ => "different char",
};
println!("fun({}, {} [{}]) = {}", byte, i, c, msg);
}
这是Rust可以提供的最惯用的构造吗?
答案 0 :(得分:4)
简而言之,是的,您应该使用模式防护。
为了使它成为可能,应该有一种方法来区分普通绑定和相等检查。例如,Scala基于变量大小写这样做:如果它以大写字母开头,则是等式检查;否则它是一种模式绑定。 Rust中没有这样的机制,所以不,现在是不可能的。