- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法理解为什么特定模式无法编译。
当我移动一个变量然后在闭包之外重新分配给它时,Rust 可以识别,我认为正确地允许代码编译,但是当我尝试在一个将运行多次的闭包中执行相同的操作时,它不会.
fn main() {
let mut v = vec![1, 2, 3, 4];
v.into_iter().fold(0, |a, b| a + b);
v = vec![1, 2, 3, 4];
vec![1, 2, 3].into_iter().for_each(|x| {
v.into_iter().fold(x, |a, b| a + b);
v = vec![1, 2, 3, 4];
});
}
error[E0507]: cannot move out of captured outer variable in an `FnMut` closure
--> src/main.rs:6:9
|
2 | let mut v = vec![1, 2, 3, 4];
| ----- captured outer variable
...
6 | v.into_iter().fold(x, |a, b| a + b);
| ^ cannot move out of captured outer variable in an `FnMut` closure
在我看来,对 v
的重新分配应该满足借用检查器的要求,即在移动后不会访问任何变量。我错过了什么吗?
最佳答案
正如@Shepmaster 提到的,解决方法是使用std::mem::replace
。
那么,有什么区别:
v.into_iter().fold(x, |a, b| a + b);
v = vec![1, 2, 3, 4];
和:
let v_old = std::mem::replace(&mut v, vec![1, 2, 3, 4]);
v_old.into_iter().fold(x, |a, b| a + b);
?
两个词:异常安全。
如果由于某种原因,表达式 v.into_iter().fold(...)
会崩溃,它会离开 v
并移出下一个语句永远不会被执行。
这在 FnOnce
中是完全可以接受的,因为您再也不会调用闭包,但在 FnMut
或 Fn
中是 Not Acceptable 在下一次电话 session 上...你会用 v
做什么?
另一方面,使用 std::mem::replace
,您交换 first 和 then 执行潜在的 panicing 操作。如果操作确实发生 panic ,那么剩下的“移出”就是一个临时变量,它无论如何都会在堆栈帧的末尾消失。没问题。
关于rust - 为什么 Rust 无法识别我在闭包内重新分配给移动的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686318/
我在一个 twig 模板中使用 Assetic 来指定要从我的包中使用的 2 个 JS 文件 { % javascripts '@JiraExtendedReportsBund
我正在做一个 VS 包,它在菜单中有一个 DynamicItemStart 按钮。我在 VS 启动时加载动态按钮的内容没有任何问题,但我试图在某些事件(例如打开项目)之后向其内容添加更多命令。我将新命
需求是从plsql调用java方法,我可以通过loadjava命令来实现它。我遵循的步骤是: 第 1 步:创建 Java Class/jar 文件并将其放置在 Unix 机器上 第2步:将Java C
我是一名优秀的程序员,十分优秀!