Я думаю, что вы думаете о жизнях неправильно.Кажется, что вы используете их, чтобы «объявить», как долго вы хотите, чтобы он жил, но вы не можете изменить время жизни ссылки.Все описатели времени жизни помогают компилятору понять время жизни в тех случаях, когда у него нет информации, чтобы исключить его.
Глава 15.4.7 Static from Rust by Example помочь вам.
По сути, есть только два способа создания 'static
данных:
- Создание константы с объявлением
static
. - Создайте строковый литерал, который имеет тип:
&'static str
.
Вы можете достичь того же, что и выше, объявив описатели времени жизни, как вы обычно делаете в Rust (но компилятор предложил время жизни 'static
, так как выне объявлял никаких жизней сам).См. Ниже.
Суть в том, что, за исключением &'static str
, время жизни никогда не может быть изменено путем указания времени жизни в ваших функциях.Когда вы пишете &[T::bar()]
, массив не является константой и будет отброшен, когда вы покинете область действия своей функции.Если вы хотите, чтобы он жил с 'static
временем жизни, вам нужно сделать его константой, как я покажу ниже.
Теперь это, вероятно, не совсем то, что вы хотели сделать, но это скомпилируется, и я надеюсь объяснитьразница:
const ARR: &'static [&'static StructType] = &[&StructType { a: "asdf" }];
pub struct StructType {
a: &'static str,
}
pub trait Foo<'a> {
fn foo() -> &'a [&'a StructType];
fn bar() -> &'a StructType;
}
pub struct Test;
impl<'a> Foo<'a> for Test {
fn foo() -> &'a [&'a StructType] {
&[&StructType { a: "asdf" }]
}
fn bar() -> &'a StructType {
&StructType { a: "asdf" }
}
}
pub struct Test2<T: Foo<'static>>(T);
impl<T: Foo<'static>> Test2<T> {
pub fn foo() -> &'static [&'static StructType] {
ARR
}
}