2015-05-29 7 views
8

Sto cercando di capire il concetto di proprietà e di prestito. All'inizio ho pensato che fosse piuttosto semplice una volta capito. Ma ...Perché i booleani sono copiabili anche se la documentazione non lo indica?

fn main() { 
    let a = 5; 

    let _y = double(a); 
    println!("{}", a); 
} 

fn double(x: i32) -> i32 { 
    x * 2 
} 

In un primo momento mi sarei aspettato questo per non compilare, perché a sarebbero stati trasferiti in _y.

Ero un po 'confuso, ma I found out che avrei avuto ragione tranne che i32 è un'eccezione alla regola perché implementa il tratto di copia.

Ho guardato a the Copy trait e, a quanto ho capito, elencano tutti i tipi che implementano questo tratto in fondo.

Quindi il tipo bool non è presente e quindi ho pensato che il comportamento predefinito fosse "spostato". Ma ...

fn main() { 
    let a = true; 

    let _y = change_truth(a); 
    println!("{}", a); 
} 

fn change_truth(x: bool) -> bool { 
    !x 
} 

Non fallisce neanche.

Ora sono abbastanza confuso. Ho trovato il Clone trait che sembra essere strettamente correlato al tratto di copia. Ma a meno che non me ne sia perso, in realtà non lo menzionano nel doc di apprendimento.

Qualcuno può darmi qualche informazione in più?

Aggiornamento:

  1. ho depositato una issue on the Rust repository.
  2. Ho anche creato un pull request con alcune proposte di modifica.

risposta

8

La tua comprensione è piuttosto azzeccata, questo sembra essere un problema con i documenti. La documentazione non mostra le istanze Copy per nessuno dei tipi di primitivi, anche se sono sicuramente Copy. A titolo di esempio per dimostrare che il compilatore considera bool essere Copy, il seguente compila bene:

fn takes_copyable<T: Copy>(foo: T) {} 

fn main() { 
    takes_copyable(true); 
} 
+0

Oh grazie! Quindi lo capisco correttamente, questo è un sollievo! Tutti i tipi primitivi implementano il tratto di copia? Questo dovrebbe essere sicuramente menzionato nei documenti poiché si tratta di un'eccezione cruciale alla regola più importante nella lingua. Se non lo hai già fatto, creerò un problema su github per farglielo sapere :) –

+1

Sì, credo che i tipi primitivi dovrebbero tutti implementare 'Copia'. E questo vale sicuramente la pena presentare un problema, quindi vai avanti. – fjh

+1

Grande grazie per il tuo tempo :) Il problema è stato creato: https://github.com/rust-lang/rust/issues/25893 –

Problemi correlati