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

ide*_*n42 4 macros rust

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

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

有没有办法检查标识符是否匹配一些基本规则,如"包含文本","以...开头","以...结尾"等.

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

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

操场

我已经使用了一些看起来像关键字参数的东西,但你可以用一些运算符来创造一些东西,比如my_macro!(foo, =my_set, *my_get, !my_toggle)对你来说效果更好.