Hello, everyone!
I have a question about why I need to add lifetime parameter on parameter when I change the returned type just like below code:
trait Messenger {
fn send(&self, message: &str);
}
pub struct LimitTracker<'a, T> {
messenger: &'a T,
value: i32,
max: i32,
}
impl<'a, T> LimitTracker<'a, T>
where
T: Messenger,
{
// will change here
fn new(messenger: &T, max: i32) -> LimitTracker<T> {
LimitTracker {
messenger,
value: 0,
max,
}
}
}
but when I change the returned type from LimitTracker<T>
to Self
, the compiler gives an error and requires adding a lifetime parameter on messenger: &T
:
impl<'a, T> LimitTracker<'a, T>
where
T: Messenger,
{
// change here
fn new(messenger: &T, max: i32) -> Self {
LimitTracker {
messenger,
value: 0,
max,
}
}
}
the error message is:
$ cargo check
Checking tests v0.1.0 (/Users/zhengxk/development/rust/projects/tests)
error[E0621]: explicit lifetime required in the type of `messenger`
--> src/lib.rs:16:9
|
15 | fn new(messenger: &T, max: i32) -> Self {
| -- help: add explicit lifetime `'a` to the type of `messenger`: `&'a T`
16 | / LimitTracker {
17 | | messenger,
18 | | value: 0,
19 | | max,
20 | | }
| |_________^ lifetime `'a` required
For more information about this error, try `rustc --explain E0621`.
error: could not compile `tests` due to previous error
I just know Self
means the type LimitTracker
, but don't know why I should add the lifetime parameter on messenger: &T
after I changed the returned type.