我试图做一些非常简单的事情:
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);
}
Rust编译不喜欢我的代码并说:
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 }
最终我想在我的类型A中添加一个int:
let x: A = A { a: 10 } + A { a: 20 };
let y: A = A { a: 10 } + 20i;
let z: A = A 10i + { a: 20 };
最好的方法是什么?
答案 0 :(得分:4)
更新
是的,你现在可以实现这个!
如何?以类似的方式:
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 };
Rust查找所有已实现的添加特征for A
。问题是因为有两个定义:impl Add<A, A> for A
和impl Add<int, A> for A
Rust'不确定'要采取哪个。不要引用我这个,因为Rust编译器内部不是我的一杯茶,但我认为Rust团队想避免付出多次发送的代价。
您的解决方案是:
A)添加像answer这样的另一个特征,它会像给出的例子一样为你做补充
B)等待关联类型降落,这是更好的选择。 (Issue #17307)
C)放弃impl Add<int, A> for A
。
我认为您想要的是多次发送,应尽快降落。有关详细信息,请参阅此RFC #195。