猿问

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

我做了两个元素的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个元素的结构怎么办?我将接受一个答案,该答案表明即使是大型结构,如果是这种情况,我也应该按值传递(尽管我不这么认为。)我有兴趣了解结构大小的良好经验法则并传递值与结构,但这不是当前的问题。


湖上湖
浏览 484回答 3
3回答

慕侠2389804

您需要Add在&Vector而不是在上实施Vector。impl<'a, 'b> Add<&'b Vector> for &'a Vector {&nbsp; &nbsp; type Output = Vector;&nbsp; &nbsp; fn add(self, other: &'b Vector) -> Vector {&nbsp; &nbsp; &nbsp; &nbsp; Vector {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x: self.x + other.x,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y: self.y + other.y,&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}在其定义中,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同一条板条箱中未定义的位置,通常情况并非如此。

胡说叔叔

我所知道的最好的文档将是关于返回指针的书章节。然而,我创建加入了大量结构的一个例子,并检查所产生的LLVM(略清洁的): (%struct.Big* sret, %struct.Big*, %struct.Big*)。我并没有声称自己是LLVM专家,但是看起来它像是通过引用自动返回。
随时随地看视频慕课网APP
我要回答