struct Document<'a> { fields: Vec>, } impl<'a> Document<'a> { fn new() -> Document<'a> { Document { fields: Vec::new() } } fn add_field(&mut self, field: T) where T: Field + 'a, { self.fields.push(Box::new(field)) } } struct TextField { name: String, value: String, } trait Field { fn name(&self) -> &str; fn string_value(&self) -> &str; } impl TextField { fn new(name: &str, value: &str) -> TextField { TextField { name: name.into(), value: value.into(), } } } impl Field for TextField { fn name(&self) -> &str { &self.name } fn string_value(&self) -> &str { &self.value } } fn main() { let mut doc = Document::new(); doc.add_field(TextField::new("title", "Rust in Action")); doc.add_field(TextField::new("isbn", "12345678")); }