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

gio*_*ele 6 rust

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

我有一个值(byte),我需要匹配其他值.一些值是固定的(b'0'.. b'9').其他在运行时计算(c = some_function()).

我目前的解决方案是使用假变量和if守护(即k if (k == c)),但它对我来说看起来不太好.我尝试使用just,c但它被解释为一个catch-all变量,而不是替换c该上下文中的值.

以下代码段显示了问题:( 同样在自行车上)

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);
}
Run Code Online (Sandbox Code Playgroud)

这是Rust可以提供的最惯用的结构吗?

Vla*_*eev 6

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

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