rust 如何在match语句中使用const范围?[副本]

tsm1rwdh  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(113)

此问题已在此处有答案

How can I store a pattern in a variable in Rust?(1个答案)
3年前关闭。
这个方法的作用是:

match 0 {
    0..=9 => (),
    _ => (),
}

但这不是:

const R: std::ops::RangeInclusive<u8> = 0..=9;

fn main() {
    match 0 {
        R => (),
        _ => (),
    }
}

playground
如果我想使用一个范围与match,我必须使用一个文字范围?

bvjxkvbb

bvjxkvbb1#

我认为问题在于,当你matchu8时,每个匹配臂必须提供u8类型的值,以便与参数进行比较。
现在,如果你写0..=9,这不是RangeInclusive(即使看起来一样)-它是一个 *range模式 *,可以用来描述匹配臂中的值范围。
所以,如果你在match arm中编写R => (),编译器会抱怨(imo是正确的):

error[E0308]: mismatched types
 --> src/main.rs:7:9
  |
7 |         R => (),
  |         ^ expected integer, found struct `std::ops::RangeInclusive`
  |
  = note: expected type `u8`
             found type `std::ops::RangeInclusive<u8>`

也就是说,它期望一个u8(或者,隐式地,u8值的范围模式),但它找到了一个RangeInclusive
现在,一个可能的解决方案是将下限和上限定义为单独的常数:

const LOWER : u8 = 0;
const UPPER : u8 = 9;
const R: std::ops::RangeInclusive<u8> = LOWER..=UPPER; // <- this is a RangeInclusive<u8>

fn main() {
    match 0 {
        LOWER..=UPPER => (), // <- this is a range pattern
        _ => (),
    }
}

另一个,在我看来不太吸引人,将是一个宏,只是扩大到您的范围:

macro_rules! myrng{() => {0..=9}}
const R: std::ops::RangeInclusive<u8> = myrng!();

fn main() {
    match 0 {
        myrng!() => (),
        _ => (),
    }
}

相关问题