亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何實現“添加”特征來引用結構?

如何實現“添加”特征來引用結構?

Git
湖上湖 2019-11-02 11:04:58
我做了兩個元素的Vector結構,我想重載+運算符。我使所有函數和方法都采用引用而不是值,并且我希望+運算符以相同的方式工作。impl Add for Vector {    fn add(&self, other: &Vector) -> Vector {        Vector {            x: self.x + other.x,            y: self.y + other.y,        }    }}根據我嘗試的變化,我會遇到生命周期問題或類型不匹配。具體來說,該&self參數似乎沒有被視為正確的類型。我已經看到了模板參數的例子上impl,以及Add,但他們只是導致不同的錯誤。我發現如何為不同的RHS類型和返回值重載運算符?但是即使我將a use std::ops::Mul;放在最前面,答案中的代碼也無法正常工作。我每晚使用rustc 1.0.0(ed530d7a3 2015-01-16 22:41:16 +0000)我不會接受“您只有兩個字段,為什么要使用引用”作為答案;如果我想要100個元素的結構怎么辦?我將接受一個答案,該答案表明即使是大型結構,如果是這種情況,我也應該按值傳遞(盡管我不這么認為。)我有興趣了解結構大小的良好經驗法則并傳遞值與結構,但這不是當前的問題。
查看完整描述

3 回答

?
慕俠2389804

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同一條板條箱中未定義的位置,通常情況并非如此。


查看完整回答
反對 回復 2019-11-02
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

我所知道的最好的文檔將是關于返回指針的書章節。然而,我創建加入了大量結構的一個例子,并檢查所產生的LLVM(略清潔的): (%struct.Big* sret, %struct.Big*, %struct.Big*)。我并沒有聲稱自己是LLVM專家,但是看起來它像是通過引用自動返回。

查看完整回答
反對 回復 2019-11-02
  • 3 回答
  • 0 關注
  • 511 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號