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:
- ho depositato una issue on the Rust repository.
- Ho anche creato un pull request con alcune proposte di modifica.
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 :) –
Sì, credo che i tipi primitivi dovrebbero tutti implementare 'Copia'. E questo vale sicuramente la pena presentare un problema, quindi vai avanti. – fjh
Grande grazie per il tuo tempo :) Il problema è stato creato: https://github.com/rust-lang/rust/issues/25893 –