首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变异FnMut闭包中的值捕获的upvar

变异FnMut闭包中的值捕获的upvar
EN

Stack Overflow用户
提问于 2015-05-05 13:03:28
回答 1查看 1.3K关注 0票数 3

我正在尝试创建一个简单的程序,其中包含一个集合,该集合将逐步清空其自身:

代码语言:javascript
复制
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);
    }
}

(在我看来)这似乎是合法的,但沙斯特克(每晚)抱怨道:

代码语言:javascript
复制
<anon>:6:13: 6:19 error: cannot borrow captured outer variable in an `FnMut` closure as mutable
<anon>:6             vector.remove(index);
                     ^~~~~~

我认为这个问题可能是一个令人失望的问题。也就是说,虽然该实现从来没有违反混叠异或变异原则,但可能是因为rustc没有实现它。

因此:

  1. 这是暂时的限制/错误,还是固有的?
  2. 如何尽可能有效地使用可变环境创建闭包?

注意:通过引用捕获不是一种选择,我希望能够左右移动关闭。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 13:18:31

事实上,这个问题很容易解决。只需将mut限定符添加到vector

代码语言:javascript
复制
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);
    }
}

(工作代码这里)

它和以往一样是可变的规则--为了改变某些东西,它必须在某个地方有mut,无论是在变量声明中还是在它的类型(&mut)中。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30053816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档