使用计算值作为匹配模式的惯用法

时间:2014-08-18 14:44:34

标签: rust

使用在运行时计算的值作为匹配模式之一的最佳方法是什么?

我有一个值(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可以提供的最惯用的构造吗?

1 个答案:

答案 0 :(得分:4)

简而言之,是的,您应该使用模式防护。

为了使它成为可能,应该有一种方法来区分普通绑定和相等检查。例如,Scala基于变量大小写这样做:如果它以大写字母开头,则是等式检查;否则它是一种模式绑定。 Rust中没有这样的机制,所以不,现在是不可能的。