2016-09-07 4 views
-2

Ich versuche Deserializer für eine BERT-Daten zu implementieren, die von einem anderen Programm über Sockets kommt. Für den folgenden Code:Kann nicht ausgeliehenen Inhalt für eine Struktur verschieben

use std::io::{self, Read}; 

#[derive(Clone, Copy)] 
pub struct Deserializer<R: Read> { 
    reader: R, 
    header: Option<u8>, 
} 

impl<R: Read> Read for Deserializer<R> { 
    #[inline] 
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { 
     self.reader.read(buf) 
    } 
} 

impl<R: Read> Deserializer<R> { 
    /// Creates the BERT parser from an `std::io::Read`. 
    #[inline] 
    pub fn new(reader: R) -> Deserializer<R> { 
     Deserializer { 
      reader: reader, 
      header: None, 
     } 
    } 

    #[inline] 
    pub fn read_string(&mut self, len: usize) -> io::Result<String> { 
     let mut string_buffer = String::with_capacity(len); 
     self.reader.take(len as u64).read_to_string(&mut string_buffer); 
     Ok(string_buffer) 
    } 
} 

Die Rust-Compiler einen Fehler generieren, wenn ich versuche, eine Zeichenfolge aus einem übergebenen Daten zu lesen:

error: cannot move out of borrowed content [E0507] 
     self.reader.take(len as u64).read_to_string(&mut string_buffer); 
     ^~~~ 
help: run `rustc --explain E0507` to see a detailed explanation 

Wie kann ich dieses Problem beheben, auch wenn mein Deserializer<R> struct hatte Clone/Copy Merkmale?

+4

Vielleicht können Sie [Bearbeiten] Ihre Frage zu erweitern, wie * das * Frage unterscheidet sich von der [** 74 ** andere Fragen über die gleiche Fehlermeldung] (http://stackoverflow.com/search?q=%5Brust%5D+kann+von+geliehenem+Kontent+is3Aq) nicht übergehen? Es wird erwartet, dass Sie [eine große Menge an Aufwand zeigen] (http://meta.stackoverflow.com/q/261592/155423), wenn Sie eine Frage stellen. – Shepmaster

+1

Mögliches Duplikat von [Ausgeborgtes Material nicht entfernen \ [E0507 \]] (http://stackoverflow.com/questions/37797035/cannot-move-out-of-borrowed-content-e0507) – polka

+2

Mögliches Duplikat von [Kann nicht Ausgeliehenen Inhalt entfernen] (http://stackoverflow.com/questions/28158738/cannot-move-out-of-borrowed-content) –

Antwort

6

Die take Methode nimmt self:

fn take(self, limit: u64) -> Take<Self> where Self: Sized

so können Sie es nicht entlehnt auf etwas verwenden.

Verwenden Sie die by_ref Methode. Ersetzen Sie die Fehlerzeile mit diesem:

{ 
     let reference = self.reader.by_ref(); 
     reference.take(len as u64).read_to_string(&mut string_buffer); 
} 
Verwandte Themen