thanks for clear explanation, it all make sense now. I noticed that if I add something to "a" then I do not need to call the clone method;
so something like this would compile [a + num::Zero::zero(), a + num::Zero::zero(), a] I guess that the addition does generate a copy. Rémi On Sun, Oct 6, 2013 at 11:35 PM, Daniel Micay <[email protected]> wrote: > On Sun, Oct 6, 2013 at 5:09 AM, Rémi Fontan <[email protected]> wrote: > >> Hi, >> >> I have just moved some of my code from 0.6 to rust 0.8 and was >> surprisingly not too difficult, great! >> >> however I noticed while converting copy to clone that I have to use a lot >> of explicit calls to ".clone()" in my templated code. In non templated >> code, the compiler is apparently more forgiving. >> >> Here' s a simple example to illustrate my point. Do you understand why I >> must write the initialisation of the list as "data:[a.clone(), a.clone(), >> a.clone()] " in the templated code and not simply "data:[a, a, a]". As T >> implements the clone trait, I was hoping the compiler would automatically >> clone when required. >> >> struct mystruct { >> data : [float, ..3] >> } >> >> impl mystruct { >> pub fn new(a:float) -> mystruct { >> mystruct{ data:[a, a, a] } >> } >> } >> >> struct mytmplstruct<T> { >> data : [T, ..3] >> } >> >> impl<T:Real+Clone> mytmplstruct<T> { >> >> pub fn new(a:T) -> mytmplstruct<T> { >> mytmplstruct{ data:[a.clone(), a.clone(), a.clone()] } >> } >> } >> >> #[test] >> fn test_structs() { >> let m1 = mystruct::new(1.234f); >> let m2 = mytmplstruct::new(1.234f); >> } >> >> >> cheers, >> >> Rémi >> > > The `Clone` trait is entirely a library feature, so the compiler will > never automatically generate calls to it. Rust has by-value assignment, > passing and returning built into the language, but for some types (anything > with a destructor, &fn or &mut) it moves ownership. > > In a generic function, it is always assumed to move ownership, as there is > no trait associated with whether types move or not. I don't think it would > be useful to have one, because `Clone` is much more generic. > > One minor nitpick is that with `[a.clone(), a.clone(), a.clone()]` you're > not taking advantage of the existing value you have. You can move the value > you do own into the array after the 2 clones. Otherwise, there's not much > point in taking it by-value (although you do want that, if you would > otherwise need to make at least one more copy). > -- Rémi Fontan : [email protected] mobile: +64 21 855 351 93 Otaki Street, Miramar 6022 Wellington, New Zealand
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
