2014-10-16 178 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

相關問題