2014-10-16 177 views
2

我试图做这样的事情很简单的几种实现方式:添加特征为同类型

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

什么是最好的方法?

+3

对于相同类型的许多特征实现不支持,您可以使用此解决方法:http://stackoverflow.com/questions/24594374/overload-operators-with-different-rhs-type – snf 2014-10-16 20:33:44

回答

4

更新:

YES,你现在可以实现这个!

怎么样?以类似的方式,以如下:

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 Aimpl Add<int, A> for A Rust是'不确定'要采取的。请不要在此引用我的意见,因为Rust编译器内部部件不是我的一杯茶,但我认为Rust团队希望避免支付多派遣的代价。

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

我想你想要的是多派遣,它应该很快登陆。有关详细信息,请参阅RFC#195

+1

我认为这不是这是一个性能问题,但更多的是关于模糊性和“箱子组合性”的问题。我希望多方派遣很快就会降临。至少这对于这些二元运算符非常有用。 – sellibitze 2014-10-17 23:36:30

相关问题