3 回答

TA貢獻1719條經驗 獲得超6個贊
您需要Add在&Vector而不是在上實施Vector。
impl<'a, 'b> Add<&'b Vector> for &'a Vector {
type Output = Vector;
fn add(self, other: &'b Vector) -> Vector {
Vector {
x: self.x + other.x,
y: self.y + other.y,
}
}
}
在其定義中,Add::add始終self取值。但是引用的類型與其他1一樣,因此它們也可以實現特征。在引用類型上實現特征時,的類型self是引用;引用按值傳遞。通常,Rust中按值傳遞意味著轉移所有權,但是當按值傳遞引用時,它們只是被復制(或者,如果是可變引用,則重新借入/移動),并且不會轉移引用的所有權(因為引用)首先不擁有其參照對象)??紤]到所有這些,Add::add(和許多其他運算符)self按值取值是有意義的:如果您需要獲得操作數的所有權,則可以實現Add直接在結構/枚舉上,如果沒有,則可以Add在引用上實現。
在這里,self類型為&'a Vector,因為這是我們要實現的類型Add。
請注意,我還為RHS類型參數指定了不同的生存期,以強調兩個輸入參數的生存期無關的事實。
1實際上,引用類型的特殊之處在于,您可以為包裝箱中定義的類型的引用實現特征(即,如果允許為實現特征T,那么您也可以為實現它&T)。&mut T并Box<T>具有相同的行為,但是對于U<T>在U同一條板條箱中未定義的位置,通常情況并非如此。

TA貢獻1804條經驗 獲得超8個贊
我所知道的最好的文檔將是關于返回指針的書章節。然而,我創建加入了大量結構的一個例子,并檢查所產生的LLVM(略清潔的): (%struct.Big* sret, %struct.Big*, %struct.Big*)。我并沒有聲稱自己是LLVM專家,但是看起來它像是通過引用自動返回。
- 3 回答
- 0 關注
- 511 瀏覽
添加回答
舉報