2017-01-07 17 views
9

単一のジェネリック型を含む構造体のために与えられたフォーマッタ(DisplayDebug、...)を生成するマクロを作成します。Rustのマクロを使用してインプットブロックを作成する際の問題

error: expected one of `,`, `=`, `>`, or `?`, found `std::fmt::Display` 
--> test.rs:6:26 
| 
6|   impl<$gen_param: $trait> $trait for $type_name<$gen_param> { 
|       ^^^^^^^^ 

は私が間違って何をやっている:私は後でコード(create_formatter!(MyStruct<T>, std::fmt::Display);)でマクロを呼び出すと

macro_rules! create_formatter { 
    ($type_name:ident<$gen_param:ident>, $trait:path) => { 
     impl<$gen_param: $trait> $trait for $type_name<$gen_param> { 
      fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { 
       // isn't yet implemented 
      } 
     } 
    }; 
} 

、コンパイラは次のようなフィードバックを与えますか?

+1

特性バインドに使用するフラグメント指定子に 'ident'を使用するとうまくいきます。 (これは 'Display'で呼び出すと' use std :: fmt :: Display; 'を追加する必要があるということも意味します)。しかし、なぜ私は確信していません。 – wimh

答えて

5

これは不思議そうですね!問題は、マクロの出力が解析される方法にあるようです:マクロ処理中に部分的にpathとして事前に解析されているため、特性バインドの解析ルールと一致しなくなりました。これについてはbug raised a few weeks agoがありました。

しかし、良いニュースがあります - it's been fixed!この例はベータ版や夜間コンパイラ(playground)で実際に動作しますが、$traitから$tに名前を変更しなければならないことに注意してください。traitはキーワードです。

関連する問題