/ / Кілька реалізацій ознаки Add для одного типу - іржа, риси

Кілька реалізацій "Додати ознаки" для одного типу - іржа, риси

Я намагаюся зробити щось дуже просте:

fn main() {
#[deriving(Show)]
struct A {
a: int
}

impl Add<A, A> for A {
fn add(&self, other: &A) -> A {
A { a: self.a + other.a }
}
}

impl Add<int, A> for A {
fn add(&self, v: &int) -> A {
A { a: self.a + *v }
}
}

let x = A { a: 10 } + A { a: 20 };

println!("x: {}", x);
}

Компіляція іржі не подобається моєму коду і каже:

src/sandbox.rs:20:12: 20:37 error: multiple applicable methods in scope [E0034]
src/sandbox.rs:20    let x = A { a: 10 } + A { a: 20 };
^~~~~~~~~~~~~~~~~~~~~~~~~
src/sandbox.rs:8:7: 10:8 note: candidate #1 is `main::A.Add<A, A>::add`
src/sandbox.rs:8       fn add(&self, other: &A) -> A {
src/sandbox.rs:9          A { a: self.a + other.a }
src/sandbox.rs:10       }
src/sandbox.rs:14:7: 16:8 note: candidate #2 is `main::A.Add<int, A>::add`
src/sandbox.rs:14       fn add(&self, v: &int) -> A {
src/sandbox.rs:15          A { a: self.a + *v }
src/sandbox.rs:16       }

Зрештою, я хочу додати int до мого типу A так:

let x: A = A { a: 10 } + A { a: 20 };
let y: A = A { a: 10 } + 20i;
let z: A = A 10i + { a: 20 };

Який найкращий підхід?

Відповіді:

4 для відповіді № 1

Оновлення:

ТАК, ви можете реалізувати це зараз!

Як? Аналогічним чином нижче:

use std::ops::Add;

#[derive(Debug)]
struct A {
a: i32,
}


impl Add<i32> for A {
type Output = A;

fn add(self, _rhs: i32) -> A {
A { a : self.a + _rhs }
}
}

impl Add<A> for A {
type Output = A;

fn add(self, _rhs: A) -> A {
A { a : self.a + _rhs.a }
}
}

fn main() {
let x = A { a: 10 } + A { a: 20 };
let y = A { a: 40 } + 2;

println!("x: {:?}ny: {:?}", x, y);
}

Пояснення. Подивіться, коли ви пишете

let x = A { a: 10 } + A { a: 20 };

Іржа шукає всі додані риси додавання for A. Проблема полягає в тому, що є два визначені: impl Add<A, A> for A і impl Add<int, A> for A Іржа не впевнена, яку взяти. Не цитуйте мене з цього приводу, тому що внутрішній компілятор Rust - це не моя чашка чаю, але я думаю, що команда Rust хотіла уникати плати за багаторазову доставку.

Ваше рішення:
А) Додайте іншу рису, як у цій відповісти це зробить доповнення для вас, як у наведеному прикладі.
Б) Почекайте, поки приземляться асоціативні типи, що вигідніше. ( Випуск №17307 )
В) Відмовтеся від impl Add<int, A> for A.

Я думаю, що ви хочете, це мультидиспетчеризація, яка незабаром повинна приземлитися. Дивіться це RFC № 195 для подробиць.