У меня есть циклический буфер, как это:Как выразить жизни для Rust итератора для контейнера
struct CircularBuffer<T: Copy> {
seqno: usize,
data: Vec<T>,
}
И я хочу, чтобы создать внешнюю-структуру является итератором. Эта структура будет относиться к внутреннему вектору данных из CircularBuffer
, как эти:
struct CircularBufferIterator<'a, T: 'a + Copy> {
buffer: &'a CircularBuffer<T>,
position: usize,
limit: usize,
}
Это лучшее, что я мог придумать, что на самом деле компилирует. Можете ли вы предложить лучший способ выразить, что CircularBufferIterator
зависит от объекта CircularBuffer
?
Какие проблемы у меня есть T: 'a + Copy
. Интересно, возможно ли это или имеет смысл сказать, что не тип T
, но CircularBuffer<T>
- это тот, на который зависит CircularBufferIterator
.
Часть, которую я не вижу, почему мне нужно добавить 'a
срок службы до T
. Разве это не может быть T: Copy
, без целой жизни? Другими словами, я не вижу случая, когда T
ссылается на CircularBuffer
. Это ссылка CircularBuffer
, которая переживает CircularBufferIterator
.
CircularBuffer
и контекст исходит из this blog post.
Непонятно, в чем проблема с представленным решением.'T' должен пережить' 'a', чтобы предотвратить оборванные указатели; 'T' должен быть' Copy', потому что вы определили 'CircularBuffer' как таковой. – Shepmaster
Благодарим вас за помощь в форматировании. Я не уверен, есть ли проблемы. Я просто не совсем понимаю, как это работает. Часть, которую я не вижу, почему мне нужно добавить «время жизни в T. Не может ли быть T: Скопировать, без целой жизни? Другими словами, я не вижу случая, когда T-образ переживает CircularBuffer. Это ссылка CircularBuffer, которая переживает CBIterator. Поэтому я искал более удобный способ выразить именно это. –