On a similar note, why did Rust decide to use the keyword "ref" when
"borrowing" in those cases and the keyword "&" when borrowing in function
arguments? Is the semantic different?

Feel free to RTFM with a link if it has already been documented.

Thanks,
Jose
On Apr 21, 2014 4:10 AM, "Léo Testard" <[email protected]> wrote:

>
> Le 21 avr. 2014 à 12:57, Artella Coding <[email protected]> a
> écrit :
>
> >
> > Suppose I have the enum :
> >
> > enum Coll<T> {
> >     A(f64,T),
> >     B(f64,T)
> > }
> >
> > I know that the compiler can automatically derive the Clone trait for
> the above. However I would like to manually implement it and was
> unsuccessful in my attempt. I tried the following :
> >
> > enum Coll<T> {
> >     A(f64,T),
> >     B(f64,T)
> > }
> >
> > impl<T: Clone> Clone for Coll<T> {
> >     fn clone (&self) -> Coll<T> {
> >         match *self {
> >             A(x,y) => A(x,y.clone()),
> >             B(x,y) => B(x,y.clone())
> >         }
> >     }
> > }
>
> The error is in your match statement. You try to bind the "T" part of your
> type to the "y" variable, which causes by default a by-value binding.
> Since you can't know statically if T has value or move semantics, you
> can't do this, since in the case of move semantics, this would move the T
> out of self, that you don't own because you take it as a reference (&self).
>
> You have instead to explicitly bind T by ref :
>
>         match *self {
>             A(x, ref y) => A(x ,y.clone()),
>             B(x, ref y) => B(x, y.clone())
>         }
>
> Leo
>
> _______________________________________________
> Rust-dev mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/rust-dev
>
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to