dharmatech
dharmatech

Reputation: 9527

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()

Upvotes: 7

Views: 149

Answers (1)

Vladimir Matveev
Vladimir Matveev

Reputation: 127771

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.

Upvotes: 7

Related Questions