錆の初心者なので、私はおそらくやや単純にこれを開始しました:コンパイルしようとしたとき、で迎えた私の性格に生涯のパラメータが必要なのはなぜですか?
...
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 }
}
}
どの、:
StackOverflowの上のどこか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 }
- 申し訳ありませんが、私はどこ忘れてしまいました - 似たようなケースで誰かが(そのままのコードを省略)のようなので、寿命パラメータを追加することを提案:
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のコミュニティが「変更可能な参照」と言っているのは本当に「変更可能な値への(不変の)参照」を意味していますか? –
私はあなたの推論をほぼ完全に理解していると信じて答えを受け入れました: –
私はあなたの推論をほぼ完全に理解していると思うので答えを受け入れました。ベクトル 'payload'。同様に、 'MQTTFrame'への参照は同じベクトル' payload'への参照です。あなたが提示したコードは、スコープを広げることによって、変更可能で明確な不変の参照 - 'デコーダ'と 'フレーム' - が範囲内にある状況につながります。これは禁止されています。正しい? –