2017-12-28 9 views
0

私は以下に概説した複雑なコードを持っています。基本的に私は、一般的な、その常に構造体を初期化する必要があり、その構造体は、デフォルトの実装を持っていますが、コンパイラはまだ文句:錆はジェネリックタイプを初期化します

fn create<T: Default>() -> T 
{ 
    T { ..Default::default() } 
} 

fn main() 
{ 
    let mut x = create::<Bob>(); 
} 

収量:

error[E0574]: expected struct, variant or union type, found type parameter `T` 
    --> macro.rs:71:5 
    | 
71 |  T { ..Default::default() } 
    | ^not a struct, variant or union type 

error: aborting due to previous error 

をそのT錆を伝える方法があります常に構造体か何かですか?

ありがとう、

答えて

3

私はこのコードを正確に実行することはできません。中括弧を使用することによって、我々はstructを初期化することをコンパイラに伝えます。しかし、ジェネリック型は構造体にすることはできません。ジェネリックは寿命を持つ特性のみにすることができます。たとえば、汎用コードでのみ構造体を使用することを主張することはできませんが、ここではDefaultの実装であるいくつかの要件を主張することがあります。そのため、汎用関数コードでは、Defaultの特性しか期待できません。

fn create<T: Default>() -> T 
{ 
    T::default() 
} 

このコードは、それにdefault()メソッドを呼び出すことにより、TDefault実装を使用します。それを使用するには、形質を使用して、適切なコードを記述する必要があります。

+0

いい仕事ですが、これはコンパイルして使用できるTを返します。 –

+0

@LukeDupin聞いてうれしい:) –

関連する問題