With FooClass that implements FooTrait, and Bar that takes the reference of a FooTrait object, the code is working:
trait FooTrait {
fn print(self);
}
struct FooClass {}
impl FooTrait for FooClass {
fn print(self) {
println!("It's a Foo");
}
}
struct Bar<'a> {
foo: &'a (dyn FooTrait),
}
impl<'a> Bar<'a> {
fn new(_foo: &'a (dyn FooTrait)) -> Bar<'a> {
Bar { foo: _foo }
}
}
fn main() {
let foo = FooClass {};
let bar = Bar::new(&foo);
println!("hello world");
}
But for
struct Bar<'a> {
foo: &'a (dyn FooTrait),
}
impl<'a> Bar<'a> {
fn new(_foo: &'a (dyn FooTrait)) -> Bar<'a> {
Bar { foo: _foo }
}
}
I have also seen they are written as
struct Bar<'a> {
foo: &'a (dyn FooTrait + 'a),
}
impl<'a> Bar<'a> {
fn new(_foo: &'a (dyn FooTrait + 'a)) -> Bar<'a> {
Bar { foo: _foo }
}
}
I think I understand that struct Bar<'a> { foo: &'a (dyn FooTrait + 'a), } says, foo should live at least as long as Bar so that reference stay valid. But this explains only Bar<'a> and foo: &'a, that I don't see what does + 'a do after dyn FooTrait in the parentheses. Also, removing +'a doesn't seems to break the program. Can someone explain to me the purpose?