2017-12-23 4 views
2

Ich versuche, eine Struktur mit einem Feld des generischen Typs zu implementieren, das Merkmalsbegrenzungen hat. Ich möchte einen Wert von Group.admin zu Printable haben. Es ist egal, was genau es ist.Generisches Strukturfeld mit Merkmalsgrenzen

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(), 
    } 
} 

Aber der Compiler erlaubt es nicht, diese:

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` 

Ich bin mir nicht sicher, was hier los ist. Vielleicht muss ich den Wert von Person::new() zu <T: Printable> irgendwie?

Antwort

1

Die group_test Funktion ist nicht generisch, es soll eine Group<T> zurückgeben, aber stattdessen geben Sie eine Group<Person> zurück.

Dies kompiliert:

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

Dies würde auch kompilieren:

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