两个数字相加而不克隆

迈克·克莱因(Maik Klein)
use std::ops::Add;
#[derive(Debug)]
pub struct Vec3<N>{
    x: N,
    y: N,
    z: N
}
impl<N> Vec3<N>{
    pub fn new(x: N, y: N , z: N) -> Vec3<N>{
        Vec3{x:x,y:y,z:z}
    }
}
impl<N : Clone + Add<Output=N>> Vec3<N>{
    pub fn  add(&mut self,v: &Vec3<N>){
        self.x = self.x.clone() + v.x.clone();
        self.y = self.y.clone() + v.y.clone();
        self.z = self.z.clone() + v.z.clone();
    }
}
impl<N: Add<Output=N>> Add for Vec3<N>{
    type Output = Vec3<N>;
    fn add(self, v: Vec3<N>) -> Vec3<N>{
        Vec3{x: self.x + v.x
            ,y: self.y + v.y 
            ,z: self.z + v.z} 
    }
}

这可以让我写。

mod vec3;
use vec3::*;
fn main() {
    let mut v1 = Vec3::<f32>::new(1.0,2.0,3.0);
    let v2 = Vec3::<f32>::new(1.0,2.0,3.0);
    v1.add(&v2);
    let v3 = v1 + v2;

    println!("{:?}", v3);
}

let v3 = v1 + v2;消耗了v1和v2。但这可能并不总是想要的,所以我添加了另一个带有签名的add函数pub fn add(&mut self,v: &Vec3<N>)

我的问题是此代码段

impl<N : Clone + Add<Output=N>> Vec3<N>{
    pub fn  add(&mut self,v: &Vec3<N>){
        self.x = self.x.clone() + v.x.clone();
        self.y = self.y.clone() + v.y.clone();
        self.z = self.z.clone() + v.z.clone();
    }
}

我需要克隆两个向量的值,以避免移动。但是我真的很想这样写

self.x = self.x + v.x.clone();或者self.x += v.x.clone();我不明白为什么我必须克隆两个值。

怎么办呢?

无聊的生活

似乎没有可用的方法来重载“ + =”运算符。但是,如果将“复制”特征替换为“复制”,则可以避免使用exclipt“ clone”(但是,如果需要,可以将它们一起使用):

impl<N: Copy + Add<Output = N>> Vec3<N> {
    pub fn add(&mut self, v: &Vec3<N>){
        self.x = self.x + v.x;
        self.y = self.y + v.y;
        self.z = self.z + v.z;
    }
}

请注意,您根本不需要调用“克隆”!

这是Rust的文档的直接引文:

我什么时候应该输入“ Copy”?

一般来说,如果您的类型可以实现Copy,则应该实现。但是,有一件重要的事情要考虑:如果您认为您的类型将来可能无法实现Copy,那么最好不要实现Copy。这是因为删除Copy是一项重大更改:如果我们将Foo设为非复制,则第二个示例将无法编译。

您可以在此处找到有关复制特征的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Golang:将两个数字相加

来自分类Dev

将两个数字相加

来自分类Dev

将两个数字相加

来自分类Dev

将数字相加,直到只剩下两个数字

来自分类Dev

如何在Swift中将两个数字相加

来自分类Dev

不使用+号将两个数字相加

来自分类Dev

通过递归C ++将两个数字相加

来自分类Dev

PHP类,用于将两个数字相加

来自分类Dev

将两个数字相加表示为链表

来自分类Dev

如何使用bash将两个数字相加

来自分类Dev

在angularJS onclick中将两个数字相加

来自分类Dev

在Java中调用类将两个数字相加

来自分类Dev

在python中并行完成两个数字的相加

来自分类Dev

用字符串将两个数字相加

来自分类Dev

通过用户输入将两个数字相加

来自分类Dev

两个数组相加

来自分类Dev

两个数不相加

来自分类Dev

两个数相加时的 NaN

来自分类Dev

如何使用<h:outputText>将两个数字相加并显示结果?

来自分类Dev

用于将两个数字相加以得出一个值的算法

来自分类Dev

CUDA:两个数字相加给出错误答案

来自分类Dev

在不使用+的情况下将两个数字相加的实现逻辑?

来自分类Dev

为什么这会导致串联而不是将两个数字相加?

来自分类Dev

如何像矩阵一样将两个数字数组彼此相加?

来自分类Dev

自动生成两个数字相加的脚本无法正常工作

来自分类Dev

为什么在cuda中将两个数字相加会导致错误的结果?

来自分类Dev

存储过程:通过将两个数字作为参数传递来相加

来自分类Dev

使用宏将两个数字相加无法执行

来自分类Dev

输入两个数字并在键入“ a”时将其相加,在键入“ s”时将其相减