2017-07-18 57 views
1

我想做出與另外一個不可改變的,引用的數據類型有點像這樣:如何爲參考類型實現添加以便我可以一次添加兩個以上的值?

use std::ops::Add; 

struct Point { 
    x: i64, 
    y: i64, 
} 

impl<'a> Add for &'a Point { 
    type Output = Point; 
    fn add(self, other: &Point) -> Point { 
     Point { 
      x: self.x + &other.x, 
      y: self.y + &other.y, 
     } 
    } 
} 

How do I implement the Add trait for a reference to a struct?建議在引用類型實施Add

我能做到這一點,其中abPoint S:

let c = &a + &b; 
let d = &c + &b; 

但不是這樣的:

let d = &a + &b + &b; 

我不介意&跡象,但未能鏈添加對我來說不太好。我想實現乘法(z = a + b * c;或者如果我必須,z = &a + &b * &c;),如果我不需要創建臨時變量,它會更清晰。

有沒有辦法讓這個工作乾淨?包圍似乎沒有幫助。

我明白這是怎麼回事,&a + &b給人以Point不是&Point,這表明我可以同時實現add(&Point, Point)add(&Point, &Point) - 總共但是現在有4例獲得所有組合的工作,因爲a + b * ca * b + c有不同的優先級/畢竟解析樹木。有更好的方法嗎?

我也想避免在非參考版本中不必要的複製。無論如何,我都會返回一個新對象,所以首先克隆輸入對我來說似乎浪費時間。

回答

4

包圍似乎沒有幫助。

您可以採取的表達的部分結果的參考:

let d = &(&a + &b) + &b; 

我不知道,如果看起來好還是不給你。

現在有4例,總

實際上,有4案件每個操作(T, T)(T, &T)(&T, T)(&T, &T)

有沒有更好的方法?

不是真的,但是這是因爲你的下一個要求......

我也想避免在非參考版本不必要的複製

這就是爲什麼運營按價值消耗,讓您重用任何潛在的分配。在Point的情況下,它(ahem)沒有意義,因爲結構非常小。對於類型Vec更可信。


所有的說法,人們通常會使用宏來避免一遍又一遍地寫同樣的東西的苦差事。例如,standard library has a macro that assumes the types implement Copy。如果你想重用分配,但是,這意味着你不希望所有4個實現是相同的。充其量,您最好可以編寫兩個實現(&T, &T)(T, &T),並從剩餘的兩個變體中轉發。

相關問題