2015-05-29 5 views
8

Próbuję zrozumieć koncepcję własności i pożyczek. Na początku myślałem, że to było całkiem proste, kiedy to zrozumiałeś. Ale ...Dlaczego kody do booleans są kopiowane, mimo że dokumentacja tego nie wskazuje?

fn main() { 
    let a = 5; 

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

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

Początkowo spodziewałem się tego nie skompilować, ponieważ a zostałby przeniesiony do _y.

Byłem nieco zdezorientowany, ale I found out, że miałbym rację z wyjątkiem tego, że i32 jest wyjątkiem od reguły, ponieważ implementuje cechę kopiowania.

Spojrzałem na the Copy trait i jak rozumiem, wymieniają wszystkie typy, które implementują tę cechę na dole.

Tak więc typ bool nie jest obecny i dlatego założyłem, że domyślnym zachowaniem było "przeniesienie". Ale ...

fn main() { 
    let a = true; 

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

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

Nie zawiedzie.

Teraz jestem bardzo zdezorientowany. Znalazłem Clone trait, który wydaje się być ściśle związany z cechą kopiowania. Ale jeśli nie przeoczyłem tego, nie wspominają o tym w dokumencie do nauki.

Czy ktoś może podać mi więcej informacji?

Aktualizacja:

  1. mam złożyła issue on the Rust repository.
  2. Zrobiłem również pull request z pewnymi propozycjami zmian.

Odpowiedz

8

Twoje zrozumienie jest bardzo trafne, to wydaje się być problem z dokumentami. Dokumentacja nie pokazuje instancji Copy dla żadnego z typów pierwotnych, mimo że są one z pewnością Copy. Jako przykład, aby pokazać, że kompilator uzna bool być Copy dodaje kompiluje dobrze:

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

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

Oh dziękuję! Więc rozumiem to poprawnie, to jest ulga! Czy wszystkie prymitywne typy implementują cechę kopiowania? To powinno zdecydowanie być wspomniane w dokumentach, ponieważ jest to kluczowy wyjątek od najważniejszej reguły w języku. Jeśli jeszcze tego nie zrobiłeś, utworzę problem na githubie, żeby im powiedzieć :) –

+1

Tak, wierzę, że prymitywne typy powinny implementować 'Copy'. I na pewno warto zgłosić problem, więc śmiało. – fjh

+1

Wielkie dzięki za poświęcony czas :) Problem został utworzony: https://github.com/rust-lang/rust/issues/25893 –

Powiązane problemy