可以对传递到宏中的标识符应用约束

  • 本文关键字:标识符 应用 约束 macros rust
  • 更新时间 :
  • 英文 :


由于 Rust 还不支持稳定版中的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)

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

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);
}

操场

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

最新更新