为了账号安全,请及时绑定邮箱和手机立即绑定

如何实现“添加”特征来引用结构?

如何实现“添加”特征来引用结构?

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 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号