2017-12-23 8 views
2

特性境界を持つ汎用タイプのフィールドを持つ構造体を実装しようとしています。私はGroup.adminの値をPrintableとします。それは正確なタイプではありません。特性境界を持つ汎用構造体フィールド

struct Group<T: Printable> { 
    admin: T, 
} 

struct Person { 
    name: String, 
} 

impl Person { 
    fn new() -> Person { 
     Person { 
      name: String::from("Bob"), 
     } 
    } 
} 

trait Printable { 
    fn print(&self); 
} 

impl Printable for Person { 
    fn print(&self) { 
     println!("{}", self.name); 
    } 
} 

fn group_test<T: Printable>() -> Group<T> { 
    Group { 
     admin: Person::new(), 
    } 
} 

しかし、コンパイラはこれを許可していません:

error[E0308]: mismatched types 
    --> src/lib.rs:27:16 
    | 
27 |   admin: Person::new(), 
    |    ^^^^^^^^^^^^^ expected type parameter, found struct `Person` 
    | 
    = note: expected type `T` 
       found type `Person` 

私はここで間違っているかわからないんだけど。多分私はPerson::new()の値を<T: Printable>にキャストする必要がありますか?

答えて

1

group_test関数は汎用ではありません。Group<T>を返しますが、代わりにGroup<Person>を返します。

これは、コンパイルされます。

fn group_test() -> Group<Person> { 
    Group { 
     admin: Person::new(), 
    } 
} 

は、これもコンパイルします:

fn group_test<T: Printable>(printable: T) -> Group<T> { 
    Group { 
     admin: printable, 
    } 
} 
関連する問題