Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何对a&;应用任意就地操作;mut参考?_Rust_In Place_Mutable Reference - Fatal编程技术网

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以这种方式使用。关于这一点的文件在哪里?更多信息在副本中链接,以及。