У меня такой тип:
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
)? У меня такое ощущение, что это может работать с общими связанными типами, но (а) я не уверен и (б) они еще не реализованы.
struct Wrap<T>(Vec<T>);
. Поскольку Vec не может сам сохранять какие-либо черты (они не имеют размера, как вы сказали), этот оператор станет незаконным. Я сделал рабочее решение с коробкой, но не думаю, что вы этого хотите. play.rust-lang.org/ - person hellow   schedule 28.05.2018Index
в качестве объекта-признака для стирания некоторых типов. Как 2_. Это не работает сIndex
напрямую, но использованиеIndex
в моем вопросе сделало это немного проще. - person Lukas Kalbertodt   schedule 28.05.2018