Я намагаюся зробити щось дуже просте:
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 для подробиць.