Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Defining tuple methods

Here's a swap function for two-element tuples:

fn swap<A, B>(obj: (A, B)) -> (B, A)
{
    let (a, b) = obj;

    (b, a)
}

Example use:

fn main() {
    let obj = (10i, 20i);

    println!("{}", swap(obj));
}

Is there a way to define swap as a method on two-element tuples? I.e. so that it may be called like:

(10i, 20i).swap()
like image 960
dharmatech Avatar asked Oct 10 '14 17:10

dharmatech


1 Answers

Yes, there is. Just define a new trait and implement it immediately, something like this:

trait Swap<U> {
    fn swap(self) -> U;
}

impl<A, B> Swap<(B, A)> for (A, B) {
    #[inline]
    fn swap(self) -> (B, A) {
        let (a, b) = self;
        (b, a)
    }
}

fn main() {
    let t = (1u, 2u);
    println!("{}", t.swap());
}

Note that in order to use this method you will have to import Swap trait into every module where you want to call the method.

like image 192
Vladimir Matveev Avatar answered Sep 18 '22 23:09

Vladimir Matveev