首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只读内部封闭借用

只读内部封闭借用
EN

Stack Overflow用户
提问于 2022-10-21 00:36:38
回答 2查看 59关注 0票数 -1

我试图从Filter类型的闭包中借用一个哈希集--基本上,我想阻止用户不止一次地选择相同的选项--这是我的代码

代码语言:javascript
复制
pub fn getRotors() -> () {
    let mut selectedrotors: HashSet<Rotors> = HashSet::new();
    let options: Vec<Rotors> = Rotors::iter().collect();
    let filter: Filter<Rotors> = &|_, cur_option, _, _| match selectedrotors.contains(cur_option) { // Borrow occurs here
        true => false,
        false => true,
    };

    for i in 0..3 {
        // Get Rotor from user
        let r: Rotors = Select::new("Select a rotor", options.to_vec())
            .with_filter(filter)
            .prompt()
            .unwrap();

        selectedrotors.insert(r); // immutable borrow occurs here e0502
        // Get char from user
    }
    ()
}

我希望selectedrotors.contains只需要对自身的不可更改的访问,所以我在这里感到困惑

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-21 06:29:07

你把这两笔借款搞混了。在闭包中有一个不可变的selectedrotors借用,在循环中有一个可变的借入。存在一个问题,因为您试图在循环中使用可变的借入,而来自闭包的不可变的借入仍然是活动的(因为闭包将在下一个循环迭代中使用)。

您可以通过在循环中声明筛选器来解决这个问题,以便在使用可变的过滤器之前可以释放不可变的借贷:

代码语言:javascript
复制
pub fn getRotors() -> () {
    let mut selectedrotors: HashSet<Rotors> = HashSet::new();
    let options: Vec<Rotors> = Rotors::iter().collect();

    for i in 0..3 {
        let filter: Filter<Rotors> = &|_, cur_option, _, _| match selectedrotors.contains(cur_option) {
            true => false,
            false => true,
        };
        // Get Rotor from user
        let r: Rotors = Select::new("Select a rotor", options.to_vec())
            .with_filter(filter)
            .prompt()
            .unwrap();

        // filter is no longer used here, so its borrow can be released
        // allowing the mutable borrow in the next line to proceed.
        selectedrotors.insert(r);
        // Get char from user
    }
    ()
}
票数 1
EN

Stack Overflow用户

发布于 2022-10-21 14:18:10

我对你使用的板条箱不太了解,但是既然你接受了Jmb的回答,我想指出你的过滤器是很奇怪的。这里有一个更好的方法:

代码语言:javascript
复制
    for i in 0..3 {
        // Get Rotor from user
        let r = Select::new("Select a rotor", options.to_vec())
            .with_filter(|_, cur_option, _, _| !selected_rotors.contains(cur_option))
            .prompt()
            .unwrap();

        selected_rotors.insert(r);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74147612

复制
相关文章

相似问题

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