pub trait Driver {
type Arguments<'a>;
}
struct StringWriter<'a, D>
where
D: Driver
{
args: D::Arguments<'a>
}
impl<'a, D> Writer<'a, D> for StringWriter<'a, D>
where
D: Driver
{
fn push_args(&mut self, args: D::Arguments<'a>) {
self.args = args;
}
}
pub trait Writer<'writer, D: Driver> {
fn push_args(&mut self, args: D::Arguments<'writer>);
}
pub trait Expression {
type Driver: Driver;
fn encode<'writer, W>(self, writer: &mut W)
where
W: Writer<'writer, Self::Driver>,
Self: 'writer;
}
struct Foo<'a, D>
where
D: Driver,
{
args: D::Arguments<'a>,
}
impl<'a, D> Expression for Foo<'a, D>
where
D: Driver,
{
type Driver = D;
fn encode<'writer, W>(self, writer: &mut W)
where
W: Writer<'writer, D>,
Self: 'writer
{
writer.push_args(self.args);
}
}
The compiler shows
error: lifetime may not live long enough
--> src/lib.rs:52:9
|
41 | impl<'a, D> Expression for Foo<'a, D>
| -- lifetime `'a` defined here
...
47 | fn encode<'writer, W>(self, writer: &mut W)
| ------- lifetime `'writer` defined here
...
52 | writer.push_args(self.args);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ argument requires that `'writer` must outlive `'a`
|
= help: consider adding the following bound: `'writer: 'a`
Someone can tell me why 'writer should outlive 'a? How to infer?