Краткий ответ: удалить 'a
время жизни для параметра self
split_first
: fn split_first(&self) -> &'a str
( детская площадка ).
Длинный ответ:
Когда вы пишете этот код:
struct Foo<'a> {
part: &'a str,
}
impl<'a> Foo<'a> {
fn new(s: &'a str) -> Self {
Foo { part: s }
}
}
Вы говорите компилятору, что все экземпляры Foo
связаны с некоторым временем жизни 'a
, которое должно быть равно или короче времени жизни строки, передаваемой в качестве параметра Foo::new
. Это время жизни 'a
может отличаться от времени жизни каждого экземпляра Foo
. Когда ты тогда пишешь:
let words = "Sometimes think, the greatest sorrow than older";
Foo::new(words)
Компилятор делает вывод, что время жизни 'a
должно быть равно или меньше времени жизни words
. За исключением любых других ограничений, компилятор будет использовать время жизни words
, которое равно 'static
, поэтому оно действует в течение всего срока службы программы.
Когда вы добавляете ваше определение split_first
:
fn split_first(&'a self) -> &'a str
Вы добавляете дополнительное ограничение: вы говорите, что 'a
также должно быть равно или короче, чем время жизни self
. Поэтому компилятор примет меньшее время жизни words
и время жизни временного экземпляра Foo
, то есть время жизни временного экземпляра. @ Ответ AndersKaseorg объясняет, почему это не работает.
Удаляя время жизни 'a
для параметра self
, я декоррелирую 'a
от времени жизни временного, поэтому компилятор может снова сделать вывод, что 'a
- это время жизни words
, которое достаточно долго для работы программы.