< 返回版块

chenzww 发表于 2020-04-05 19:40

use std::ops::Add;

#[derive(Debug)]
struct Complex { a: f64, b: f64, }

impl Add for Complex {
    type Output = Complex;
    fn add(self, rhs: Complex) -> Self::Output {
        Complex { a: self.a+rhs.a, b: self.b+rhs.b }
    }
}

fn main() {
    let cp1 = Complex { a: 1f64, b: 2.0 };
    let cp2 = Complex { a: 5.0, b: 8.1 };
    let cp3 = cp1 + cp2;
    println!("{:?}", cp3);
}

add方法的首个参数为什么用self,而不是&self?不解。

评论区

写评论
Ryan-Git 2020-04-06 23:28

我理解是因为运算符 + 的语义就是 consume,不是 ref。

solarsail 2020-04-06 11:23

我的理解:

  • self,可以 impl<'a, 'b> Add<&'b T> for &'a T 实现非move版本;
  • &self,没法实现move版本。

表达能力变窄了。

作者 chenzww 2020-04-05 23:46

我是想为add方法的参数使用self,而不用&self的原因。是想深入了解self各种形态的用法,而你的回答跳过了很多内容。完全不是我想要问的问题。

对以下内容的回复:

xjkdev 2020-04-05 20:33

https://stackoverflow.com/questions/27856991/operator-overloading-by-value-results-in-use-of-moved-value

这里的回答说你可以对&Complex重载Add,这样就能达到不移动的效果。

1 共 4 条评论, 1 页