3 回答

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

TA贡献1804条经验 获得超8个赞
我所知道的最好的文档将是关于返回指针的书章节。然而,我创建加入了大量结构的一个例子,并检查所产生的LLVM(略清洁的): (%struct.Big* sret, %struct.Big*, %struct.Big*)。我并没有声称自己是LLVM专家,但是看起来它像是通过引用自动返回。
- 3 回答
- 0 关注
- 488 浏览
添加回答
举报