У меня есть этот тип:
struct Wrap<T>(Vec<T>);
Я хочу реализовать std::ops::Index
и возвращать ссылки на объекты признаков.Это была моя первая попытка ( Детская площадка ):
use std::ops::Index;
use std::fmt::Display;
impl<T> Index<usize> for Wrap<T>
where
T: Display
{
type Output = Display;
fn index(&self, index: usize) -> &Self::Output {
&self.0[index]
}
}
Это не работает и приводит к этой ошибке:
error[E0310]: the parameter type `T` may not live long enough
--> src/main.rs:13:9
|
7 | impl<T> Index<usize> for Wrap<T>
| - help: consider adding an explicit lifetime bound `T: 'static`...
...
13 | &self.0[index]
| ^^^^^^^^^^^^^^
|
note: ...so that the type `T` will meet its required lifetime bounds
--> src/main.rs:13:9
|
13 | &self.0[index]
| ^^^^^^^^^^^^^^
Я думаю, я знаю, почему этослучается: type Output = Display
эквивалентно type Output = Display + 'static
, так как каждый объект черты имеет предел жизни, который по умолчанию равен 'static
.
Так что теперь я могу просто добавить 'static
, связанный с моим параметром T
,но это слишком ограничено, я думаю.Я легко могу реализовать такой метод, когда не использую связанный тип:
impl<T> Wrap<T>
where
T: Display,
{
fn my_index(&self, index: usize) -> &Display {
&self.0[index]
}
}
Нет обязательного ограничения 'static
, потому что теперь сигнатура десугарсит до:
fn my_index<'a>(&'a self, index: usize) -> &'a Display + 'a
Что имеет смысл:объект черты должен жить как минимум 'a
.( Игровая площадка со всем кодом ).
Но можно ли сделать эту работу, используя связанные типы (как с чертой Index
)?У меня есть ощущение, что это может работать с родственными связанными типами, но (а) я не уверен и (б) они еще не реализованы.