
Question:
This is a follow up question to: <a href="https://stackoverflow.com/questions/24291288/how-to-fix-cannot-infer-an-appropriate-lifetime-for-automatic-coercion" rel="nofollow">How to fix: cannot infer an appropriate lifetime for automatic coercion</a>.
I wonder why do these both structs differ in the way they are affected by lifetimes.
<strong>Example 1</strong>
use http;
pub struct Request<'a> {
pub origin: &'a http::server::Request,
}
<strong>Example 2</strong>
use http;
pub struct Response<'a, 'b> {
pub origin: &'a mut http::server::ResponseWriter<'b>,
}
They look pretty much similar to me except that the second one holds a mutable reference whereas the first one holds an immutable reference.
However, for <em>Example 2</em> I can't just use a lifetime for the reference. I <strong>must</strong> give a lifetime for the struct as well.
So, I wonder is there something <em>inside</em> the struct that causes such behavior or is it really because the one in the second example is a mutable reference. And if so, why exactly does that cause that.
Answer1:&'a T
means that you have a reference to a T
object which is valid for the lifetime'a
.
T<'b>
means a T
object containing an object inside itself valid for the lifetime 'b
, as in struct T<'b> { t: &'b U }
.
&'a T<'b>
is thus a reference with lifetime 'a
to a T<'b>
object.
In the case of the ResponseWriter
, it contains references to the Request
and to the TcpStream
, whereas the Request
does not contain any references.