- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个简单的程序,其中包含一个包含逐渐清空自身的集合的闭包:
fn main() {
let vector = vec![1, 2, 3];
let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
return true
}
false
};
for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}
这似乎是 kosher(对我来说),但 rustc 提示(每晚):
<anon>:6:13: 6:19 error: cannot borrow captured outer variable in an `FnMut` closure as mutable
<anon>:6 vector.remove(index);
^~~~~~
我预计问题可能与脱糖有关。也就是说,虽然实现从不违反别名 XOR 变异原则,但也许 desguaring 使得 rustc
没有意识到这一点。
因此:
注意:通过引用捕获不是一个选项,我希望能够移动闭包。
最佳答案
其实这个问题很容易解决。只需将 mut
限定符添加到 vector
即可:
fn main() {
let mut vector = vec![1, 2, 3];
let mut allow_once = move |i: &i32| -> bool {
if let Some(index) = vector.position_elem(i) {
vector.remove(index);
true
} else { false }
};
for e in &[1, 2, 3, 1, 2, 3] {
let is_in = if allow_once(e) { "is" } else { "is not" };
println!("{} {} allowed", e, is_in);
}
}
(工作代码 here )
它只是和往常一样的可变性规则——为了改变某些东西,它必须在某处有mut
,无论是在它的变量声明中还是在它的类型中(&mut
).
关于closures - 在 FnMut 闭包中改变由值捕获的 upvar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30053816/
在我目前处理的 TCL 代码中,每个过程中的参数都被 upvar'ed 到一个局部变量,可以这么说,然后使用。像这样的: proc configure_XXXX { params_name_abc p
想听取 TCL 专业人士的建议以获得最佳实践。 假设您想使用 proc 构造一个包含特定数据的列表。现在哪个是最好的方法? proc processList { myList } { upvar
我对 TCL 中的 upvar 命令有疑问。使用 upvar 命令,我们可以在其他过程中引用全局变量或局部变量。我看到了以下代码: proc tamp {name1 name2} { upva
我正在尝试创建一个简单的程序,其中包含一个包含逐渐清空自身的集合的闭包: fn main() { let vector = vec![1, 2, 3]; let mut allow_o
我想知道是否有人可以解释为什么我可以在嵌套的 proc 中成功链接 upvars 的幕后细节,但它在嵌套的 TclOO 方法中不起作用(在子类中覆盖的那些方法)。 (有人告诉我,在 TclOO 类方法
根据规范/实现,访问命名空间变量与 upvar 之间是否存在预期差异。 我必须使用回调函数。我不能只是传递一个论点。经验上,upvar 获胜。但在所有合理的情况下,这是预期的吗? 谢谢。 最佳答案 当
我是一名优秀的程序员,十分优秀!