具有特征边界的通用结构字段

时间:2017-12-23 13:20:09

标签: rust

我试图用具有特征边界的泛型类型的字段来实现结构。我希望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 个答案:

答案 0 :(得分: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,
    }
}