0

有没有办法在不需要AddAssignorClone的情况下编写这个函数T

use std::ops::Add;

fn increment<T: Add<isize, Output = T>>(x: &mut T) {
    *x = *x + 1;
}

如所写,我收到错误:

error[E0507]: cannot move out of `*x` which is behind a mutable reference
 --> src/lib.rs:4:10
  |
4 |     *x = *x + 1;
  |          ^^ move occurs because `*x` has type `T`, which does not implement the `Copy` trait
4

1 回答 1

0

根据@Shepmaster 在评论中的回复,我认为如果不更改函数签名,这是不可能的,因为x如果从恐慌中恢复,正在应用的函数可能会恐慌而进入内存不安全状态。

但是,通过添加Default约束,可以使用mem::replace.

use std::mem;
use std::ops::Add;

fn increment<T: Default + Add<isize, Output = T>>(x: &mut T) {
    let y = mem::replace(x, Default::default());
    *x = y + 1;
}

现在如果add恐慌,x将有默认的T.

于 2020-11-16T18:48:02.673 回答