【问题标题】:Copying vector of structures复制结构向量
【发布时间】:2016-12-02 15:49:24
【问题描述】:

我正在实现一个 Rust 应用程序,其中结构向量将被传递到闭包中。

#[derive(Clone, Copy)]
struct AttackInfo {
    ppid: usize,
    pname: &'static str,
    cpu: f32,
}

type AList = Vec<AttackInfo>;

fn Task() {
    let mut list: AList = AList::new();

    // ...
    // I fill up the list with many items
    // ...

    output.put(|msg| *msg = Some(Message::Value(list)));
}

output.put 是一个带有闭包的函数,这是由库定义的。

由于list 变量的错误,我无法发送列表的值:

cannot move out of captured outer variable in an `FnMut` closure

闭包会被执行多次,直到列表中的所有值都被清空。如何在不丢失变量范围的情况下发送列表数据?

【问题讨论】:

  • 闭包会被执行多次,直到列表中的所有值都被清空。如何在不丢失变量范围的情况下发送列表数据。 => 你是什么意思?查看编写的代码,我希望 list 被完全消耗一次(一次)。
  • 我的意思是函数put会读出向量中的所有数据。当然,该功能可以一次性完成。
  • 用大写字母命名函数不是惯用的 Rust。函数和变量使用snake_case

标签: rust closures


【解决方案1】:

当您编写Message::Value(list) 时,您通过将list 传递给Value 来消耗它。 FnMut 闭包可能被执行多次,因此编译器必须假定它将被多次调用。由于您的闭包试图移动list,因此编译器会抱怨,因为不允许您多次将值移出某个位置。

根据output.put() 的尝试,可能有几种解决方案:

  • 如果闭包只会被调用一次,那么你应该将闭包参数的类型更改为FnOnce。这将允许您在尝试时移动list

  • 如果闭包可能被多次调用,你需要引用list然后克隆它:

    fn Task() {
        let mut list: AList = AList::new();
    
        // ...
        // I fill up the list with many items
        // ...
    
        output.put(|msg| *msg = Some(Message::Value((&list).clone())));
    }
    

【讨论】:

  • 一个简单的参考可以代替Rc,不是吗?。
  • 非常感谢您的投入,一个简单的参考就完美了。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-03-06
  • 2013-09-16
  • 2016-12-06
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多