添加特征的几种实现用于相同类型

时间:2014-10-16 19:30:13

标签: rust traits

我试图做一些非常简单的事情:

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 };

最好的方法是什么?

1 个答案:

答案 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 Aimpl Add<int, A> for A Rust'不确定'要采取哪个。不要引用我这个,因为Rust编译器内部不是我的一杯茶,但我认为Rust团队想避免付出多次发送的代价。

您的解决方案是: A)添加像answer这样的另一个特征,它会像给出的例子一样为你做补充 B)等待关联类型降落,这是更好的选择。 (Issue #17307
C)放弃impl Add<int, A> for A

我认为您想要的是多次发送,应尽快降落。有关详细信息,请参阅此RFC #195