可以对传入宏的标识符应用约束吗?

时间:2017-02-08 03:37:57

标签: macros rust

由于Rust在stable中尚不支持concat_idents,因此可能需要传入多个类似的标识符作为参数。

这允许意外传递错误的位置参数。

有没有办法检查标识符是否符合某些基本规则,例如“包含文本”,“以...开头”,“以...结尾”等。

struct_bitflag_flag_fn_impl!(
    MyStructType, my_struct_flag::SELECT,
    select_test, select_set, select_clear, select_set_bool, select_toggle);
struct_bitflag_flag_fn_impl!(
    MyStructType, my_struct_flag::HIDDEN,
    hidden_test, hidden_set, hidden_clear, hidden_toggle, hidden_set_bool);

//  Humans make mistakes, how to prevent?     ->  ^^^^^^         ^^^^^^^^
//  (arguments may be transposed by accident)

1 个答案:

答案 0 :(得分:6)

不,但是你可以通过向宏添加结构而不是仅仅传递以逗号分隔的名称来更容易发现错误:

macro_rules! my_macro {
    // Note: parameter must be in the right order; they're not general
    // keyword arguments.
    ($name:ident, set=$set:ident, get=$get:ident, toggle=$toggle:ident)
    =>
    (
        {}
    )
}

fn main() {
    // Correct usage
    my_macro!(foo, set=my_set, get=my_get, toggle=my_toggle);
    // Not right, but easier to spot with the keyword argument-style usage.
    my_macro!(foo, set=my_set, get=my_toggle, toggle=my_get);
}

Playground

我使用的东西看起来像关键字参数,但你可以用my_macro!(foo, =my_set, *my_get, !my_toggle)这样的运算符来创造一些东西,如果这对你更有效。