2016-12-30 14 views
3

マクロでtyを使用すると、これはほとんどすべての場合に有効です。 しかし、新しいstructインスタンスを宣言するのに使用できないようです。マクロ内の型(ty)を使用してRustで構造体インスタンスを構築する方法は?

例:$my_type { some_member: some_value }

より包括的な例

macro_rules! generic_impl { 
    ($my_type:ty) => { 
     impl $rect_ty { 
      pub fn flip(&self) -> $my_type { self.some_method() } 
      pub fn swap(&self, &other: $my_type) -> { self.some_swap_method(other) } 
      // so far so good! 

      // now our troubles start :(
      pub fn create(&self) -> $my_type { 
       return $my_type { foo: 1, bar: 2, baz: 2 }; 
       //  ^^^^^^^^ this fails!!! 
      } 
     } 
    } 
} 

// example use 
generic_impl(MyStruct); 
generic_impl(MyOtherStruct); 

エラーは次のとおりです。

error: expected expression, found `MyStruct` 

は、私がimpl $my_typeを使用することはできませんexpr手段にtyを変更します。 2倍の引数に渡すほかに

、一つの他のtyexpr

マクロへty引数に基づいて構造体を構築する方法はありますか?

答えて

3

いいえ、tyではありません。

代わりに、identをキャプチャするのが簡単な修正です。両方のコンテキストで有効です。単純な識別子よりも複雑なものが必要な場合は、名前(構築用)とタイプ(他の用途用)を別々に取得し、使用時にそれらを指定する必要があるでしょう。

+1

ありがとうございます、見つかった 'tt'も動作します。 – ideasman42

関連する問題