Rust 如何对a&;应用任意就地操作;mut参考?
是否有一种方法可以编写此函数而不需要Rust 如何对a&;应用任意就地操作;mut参考?,rust,in-place,mutable-reference,Rust,In Place,Mutable Reference,是否有一种方法可以编写此函数而不需要T上的AddAssign或Clone 使用std::ops::Add; fn增量(x:&mut T){ *x=*x+1; } 如前所述,我得到一个错误: error[E0507]:无法移出可变引用后面的“*x” -->src/lib.rs:4:10 | 4 |*x=*x+1; |^^发生移动是因为“*x”的类型为“T”,而该类型没有实现“Copy”特性 根据@Shepmaster在评论中的回答,我认为如果不更改函数签名,这是不可能的,因为如果从中恢复,应用的
T
上的AddAssign
或Clone
使用std::ops::Add;
fn增量(x:&mut T){
*x=*x+1;
}
如前所述,我得到一个错误:
error[E0507]:无法移出可变引用后面的“*x”
-->src/lib.rs:4:10
|
4 |*x=*x+1;
|^^发生移动是因为“*x”的类型为“T”,而该类型没有实现“Copy”特性
根据@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;
}
使用std::mem;
使用std::ops::Add;
fn增量(x:&mut T){
设y=mem::replace(x,Default::Default());
*x=y+1;
}
现在,如果
add
panics,x
将具有默认的T
,而无需-允许进行哪些更改?对于当前编写的函数签名,这只能通过中的解决方案来解决;TL;DR“不,没有不安全的代码,您就不能这样做”。由于add
拥有参数的所有权,因此如果add
陷入恐慌,则x
将处于未定义状态。这将导致内存不安全,而安全锈迹不允许这样做。另请参见,还有许多其他答案涉及更改函数签名/特征边界,例如添加Copy
(但由于未指明的原因,您已经排除了Clone
),或者可以使用引用作为参数进行添加。回答者花时间试图猜测在他们花时间提供答案后你会施加哪些其他限制,这不是很有趣。@Shepmaster你的第三条评论清楚地说明了为什么这是不可能的。我没有考虑从恐慌中恢复过来的问题。我添加和删除的评论是因为我没有意识到你是同一个人发表了三条评论。我试着一个接一个地回答他们。这不是不可能的,只是在安全的情况下不被接受。这就是为什么像这样的板条箱会用
/take_mut
替换_。如果要使用默认值
,那么最好使用*x=mem::take(x)+1
您还可以将挂起的绑定更改为,Rust具有量化约束
?我以前从未见过
for以这种方式使用。关于这一点的文件在哪里?更多信息在副本中链接,以及。