2017-02-08 9 views
3

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) 

答えて

5

など、「で終わる」、「で始まる」、しかし、あなたはそれが簡単に行うことができますマクロに構造を付加するだけではなく、カンマで区切られた名前渡すことでミスを発見する:

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

を私は、キーワードargumeのようなものを使用しましたntsが、あなたのためにうまくいくなら、my_macro!(foo, =my_set, *my_get, !my_toggle)のようないくつかの演算子で物を作り出すことができます。

関連する問題