3 回答

TA貢獻1719條經(jīng)驗 獲得超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一樣,因此它們也可以實現(xiàn)特征。在引用類型上實現(xiàn)特征時,的類型self是引用;引用按值傳遞。通常,Rust中按值傳遞意味著轉(zhuǎn)移所有權(quán),但是當按值傳遞引用時,它們只是被復(fù)制(或者,如果是可變引用,則重新借入/移動),并且不會轉(zhuǎn)移引用的所有權(quán)(因為引用)首先不擁有其參照對象)。考慮到所有這些,Add::add(和許多其他運算符)self按值取值是有意義的:如果您需要獲得操作數(shù)的所有權(quán),則可以實現(xiàn)Add直接在結(jié)構(gòu)/枚舉上,如果沒有,則可以Add在引用上實現(xiàn)。
在這里,self類型為&'a Vector,因為這是我們要實現(xiàn)的類型Add。
請注意,我還為RHS類型參數(shù)指定了不同的生存期,以強調(diào)兩個輸入?yún)?shù)的生存期無關(guān)的事實。
1實際上,引用類型的特殊之處在于,您可以為包裝箱中定義的類型的引用實現(xiàn)特征(即,如果允許為實現(xiàn)特征T,那么您也可以為實現(xiàn)它&T)。&mut T并Box<T>具有相同的行為,但是對于U<T>在U同一條板條箱中未定義的位置,通常情況并非如此。

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