macros - 如何在 Rust 中编写宏来匹配集合中的任何元素?

标签 macros rust variadic-macros

在 C 中,我习惯于:

if (ELEM(value, a, b, c)) { ... }

这是一个带有可变数量参数的宏,以避免输入错误

if (value == a || value == b || value == c) { ... }

一个 C 例子可以在 Varargs `ELEM` macro for use with C 中看到。 .

这在 Rust 中可能吗?我假设它会使用 match。如果是这样,如何使用可变参数来实现这一目标?

最佳答案

macro_rules! cmp {
    // Hack for Rust v1.11 and prior.
    (@as_expr $e:expr) => { $e };

    ($lhs:expr, $cmp:tt any $($rhss:expr),*) => {
        // We do this to bind `$lhs` to a name so we don't evaluate it multiple
        // times.  Use a leading underscore to avoid an unused variable warning
        // in the degenerate case of no `rhs`s.
        match $lhs { _lhs => {
            false || $(
                cmp!(@as_expr _lhs $cmp $rhss)
            ) || *
        //    ^- this is used as a *separator* between terms
        }}
    };

    // Same, but for "all".
    ($lhs:expr, $cmp:tt all $($rhss:expr),*) => {
        match $lhs { _lhs => {
            true && $( cmp!(@as_expr _lhs $cmp $rhss) ) && *
        }}
    };
}

fn main() {
    let value = 2;
    if cmp!(value, == any 1, 2, 3) {
        println!("true! value: {:?}", value);
    }
    if cmp!(value*2, != all 5, 7, 1<<7 - 1) {
        println!("true! value: {:?}", value);
    }
}

关于macros - 如何在 Rust 中编写宏来匹配集合中的任何元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38828920/

相关文章:

vba - 在从 vba 创建的新工作簿中设置命名范围使它们成为本地范围而不是全局范围

c - 当exp中有引号时,LPC宏如何进行字符串化?

rust - 在 Rust 中包含特定于 CPU 架构的源文件

c - ##__VA_ARGS__ 在 C99 下当零参数时不吞下逗号

c++ - 使用可变参数宏或模板来实现一组功能

c++ - 清理 C/C++ 代码揭示可变参数宏的问题

types - 在 Haxe 中,如何将类型/类添加到带有宏的模块中?

C++ 条件宏评估

rust - 在可变选项内的值上调用方法

rust - 当 rustc 启用了 musl 时,无法使用 cargo 构建 rust-libc