有没有办法匹配两个枚举变量,并将匹配的变量绑定到变量?

时间:2018-03-16 21:11:35

标签: rust

我有这个枚举:

enum ImageType {
    Png,
    Jpeg,
    Tiff,
}

有没有办法匹配前两个中的一个,还将匹配的值绑定到变量?例如:

match get_image_type() {
    Some(h: ImageType::Png) | Some(h: ImageType::Jpeg) => {
        // Lots of shared code
        // that does something with `h`
    },
    Some(ImageType::Tiff) => { ... },
    None => { ... },
}

这种语法不起作用,但有没有呢?

1 个答案:

答案 0 :(得分:9)

看起来你问的是如何在第一种情况下绑定值。如果是这样,你可以使用它:

match get_image_type() {
    // use @ to bind a name to the value
    Some(h @ ImageType::Png) | Some(h @ ImageType::Jpeg) => {
        // Lots of shared code that does something with `h`
    },
    Some(ImageType::Tiff) => { ... },
    None => { ... }
}

如果您还希望获得match语句之外的绑定值,可以使用以下内容:

let matched = match get_image_type() {
    Some(h @ ImageType::Png) | Some(h @ ImageType::Jpeg) => {
        // Lots of shared code that does something with `h`
        Some(h)
    },
    Some(h @ ImageType::Tiff) => {
        // ...
        Some(h)
    },
    None => {
        // ...
        None
    },
};

在这种情况下,最好先简单let h = get_image_type(),然后match h(感谢BHustus)。

请注意使用h @ <value>语法将变量名h绑定到匹配的值(source)。