Se si guarda a unix-socket
, mi sono imbattuto in questo codice:Perché sarebbe necessario eseguire due cast in un puntatore raw mutevole in una riga?
let timeout = unsafe {
let mut timeout: libc::timeval = mem::zeroed();
let mut size = mem::size_of::<libc::timeval>() as libc::socklen_t;
try!(cvt(libc::getsockopt(self.0,
libc::SOL_SOCKET,
kind,
&mut timeout as *mut _ as *mut _,
&mut size as *mut _ as *mut _)));
timeout
};
ero curioso di queste linee, in particolare:
&mut timeout as *mut _ as *mut _,
&mut size as *mut _ as *mut _
Perché è necessario eseguire due calchi a un puntatore RAW mutabile in una riga? Perché non sarebbe stato sufficiente lanciare solo una volta?
Ah, ho capito. Grazie per il chiarimento! Domanda successiva: ruggine deduce la seconda conversione a causa della firma di 'getsockopt' o è solo che * ogni * puntatore viene lanciato su * * mut c_void' se faccio la conversione abbastanza spesso? Anche per un tipo originale arbitrario, diciamo '& mut Vec'? –
Nah, per fortuna no! Sarebbe spaventoso: S È davvero a causa della firma di 'getsockopt', in particolare perché la posizione dell'espressione ha quel tipo di bersaglio. Lo stesso sarebbe il caso, ad es. se stai facendo 'let ptr: * mut c_void = & mut timeout come * mut _ as * mut _;'. –