Будучи новичком Rust, я, вероятно, несколько наивно начал с этим:Почему моя черта нуждается в параметре lifetime?
...
pub trait Decode<T> {
fn decode_from<R: io::Read + ?Sized>(&mut self, stream: &mut R) -> T;
}
pub struct MQTTFrame<'a> {
pub payload: &'a Vec<u8>,
}
pub struct MQTTFrameDecoder<'a> {
pub payload: &'a mut Vec<u8>,
}
impl<'a> Decode<MQTTFrame<'a>> for MQTTFrameDecoder<'a> {
fn decode_from<R: io::Read + ?Sized>(&mut self, stream: &mut R) -> MQTTFrame<'a> {
stream.read(&mut self.payload);
MQTTFrame{ payload: self.payload }
}
}
Который, при попытке компиляции, был встречен с:
src/testbed/mod.rs:31:24: 31:36 error: cannot infer an appropriate lifetime for automatic coercion due to conflicting requirements [E0495]
src/testbed/mod.rs:31 MQTTFrame{ payload: self.payload }
^~~~~~~~~~~~
src/testbed/mod.rs:29:5: 32:6 help: consider using an explicit lifetime parameter as shown: fn decode_from<R: io::Read + ?Sized>(&'a mut self, stream: &mut R)
-> MQTTFrame<'a>
src/testbed/mod.rs:29 fn decode_from<R: io::Read + ?Sized>(&mut self, stream: &mut R) -> MQTTFrame<'a> {
src/testbed/mod.rs:30 stream.read(&mut self.payload);
src/testbed/mod.rs:31 MQTTFrame{ payload: self.payload }
src/testbed/mod.rs:32 }
Где-то на StackOverflow - извините, я забыл, где - кто-то в подобном случае предложено добавить параметр пожизненную как так (опуская без изменений кода):
pub trait Decode<'a, T> {
fn decode_from<R: io::Read + ?Sized>(&'a mut self, stream: &mut R) -> T;
}
impl<'a> Decode<'a, MQTTFrame<'a>> for MQTTFrameDecoder<'a> {
fn decode_from<R: io::Read + ?Sized>(&'a mut self, stream: &mut R) -> MQTTFrame<'a> {
stream.read(&mut self.payload);
MQTTFrame{ payload: self.payload }
}
}
и вот, и вот! Он компилируется. Теперь, если бы я мог понять только , почему компилируется. Может ли кто-нибудь объяснить
- Почему исходный код не компилировался?
- Почему код изменен?
Спасибо, Djzin, этот ответ имеет кольцо правды, хотя я не совсем понимаю его. Мне нужно время подумать об этом. Не удивляйтесь, если я вернусь к вам с большим количеством вопросов. Один из них у меня уже есть: если сообщество Rust говорит «изменчивая ссылка», действительно ли это означает «неизменную» ссылку на изменяемое значение »? –
Я принял ваш ответ, потому что я считаю, что теперь я почти полностью понимаю ваши рассуждения: –
Я принял ваш ответ, потому что я считаю, что теперь я почти полностью понимаю ваши рассуждения: ссылка на 'MQTTFrameDecoder' есть - по транзитивности - * изменяемая * ссылка на вектор 'полезная нагрузка'. Аналогично, ссылка на «MQTTFrame» является ссылкой на тот же вектор «полезная нагрузка». Представленный вами код приведет к расширению сферы охвата - к ситуации, когда изменяемые и различные неизменяемые ссылки - 'decoder' и' frame' - находятся в сфере охвата. Это запрещено. Верный? –