首页 > 解决方案 > 如何在不消耗值的情况下实现 Add trait

问题描述

当为一个简单的结构实现Add特征(以及其他一些特征,如Mul,Sub等)时,必须完全消耗结构值,因此以后无法使用它。

同时,内置原语(u8,usize等)实现了在被调用Add后允许使用它。add

如何实现Add我的结构以便在调用后能够使用它add

use std::ops::Add;

struct I(usize);
impl Add for I {
    type Output = Self;
    fn add(self, rhs: Self) -> Self {
        I(self.0 + rhs.0)
    }
}

fn main() {
    let a = 123;
    let b = a + a; // no error

    let a1 = I(123);
    let b1 = a1 + a1;

    println!("b={}", b);
}
error[E0382]: use of moved value: `a1`
  --> src/main.rs:16:19
   |
15 |     let a1 = I(123);
   |         -- move occurs because `a1` has type `I`, which does not implement the `Copy` trait
16 |     let b1 = a1 + a1;
   |              --   ^^ value used here after move
   |              |
   |              value moved here

标签: rusttraits

解决方案


您应该能够添加#[derive(Copy, Clone)]到结构中,然后它不会消耗该值,而是消耗一个副本。


推荐阅读