Se si controlla lo docs for Read
, la maggior parte dei metodi accetta uno &mut self
. Ciò ha senso, poiché la lettura da qualcosa di solito aggiorna un offset interno in modo che la lettura successiva restituisca dati diversi. Tuttavia, questo compila:Perché è possibile implementare Read su un riferimento immutabile a File?
use std::io::Read;
use std::fs::File;
fn main() {
let file = File::open("/etc/hosts").unwrap();
let vec = &mut Vec::new();
(&file).read_to_end(vec).unwrap();
println!("{:?}", vec);
}
Il file non è mutevole, ma i dati sono certamente in corso la lettura in questo sembra non corretto per me.. It was pointed out that there is an impl<'a> Read for &'a File
, ma il fatto che un'istanza immutabile sia apparentemente mutata sembra ancora strano.
La risposta a [Perché è possibile chiamare File.take() su un riferimento?] (Http://stackoverflow.com/q/31503429/395760) risolvere questo problema o si sta chiedendo * perché * 'Leggi' è implementato su '& File'? – delnan
@delnan La domanda qui è: perché '& file' è sufficiente? Ci si dovrebbe aspettare che sia richiesto "e mut file". – mdup
@delnan (Non ho fatto la domanda, ma) Non penso che risponda a questa domanda. Deve esserci qualcos'altro che sta succedendo. 'read_to_end' dovrebbe funzionare su' & mut File' o '& mut & File', ma' (& file) 'non è nessuno di quelli. – fjh