3 回答

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

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