首页 > 解决方案 > 如何序列化为切片数组?

问题描述

假设我有一个代表纯函数的特征;为输出提供了内存,输入和输出都应该是 serde/bincode 编码的。是否有可能让它做我想做的事情,或者重组事情以习惯性地实现相同的目的?

trait Pure {
    fn pure(inputs: &[&[u8]], outputs: &[&mut [u8]]);
}

struct Identity {}

impl Pure for Identity {
    fn pure(inputs: &[&[u8]], outputs: &[&mut [u8]]) {
        let x: u32 = bincode::deserialize(inputs[0]).expect("input decode failed");
        bincode::serialize_into(outputs[0], &x).unwrap();
    }
}

让编译器抱怨:

error[E0508]: cannot move out of type `[&mut [u8]]`, a non-copy slice
  --> src/main.rs:10:33
   |
10 |         bincode::serialize_into(outputs[0], &x).unwrap();
   |                                 ^^^^^^^^^^
   |                                 |
   |                                 cannot move out of here
   |                                 move occurs because `outputs[_]` has type `&mut [u8]`, which does not implement the `Copy` trait

标签: rust

解决方案


您的代码有两个问题。首先,如果您希望能够改变内部引用,那么您必须有一个可变的外部引用。IOW,你的pure函数应该带一个&mut[&mut [u8]]for 参数。

其次,为了将可变引用传递给deserialize_into,您需要重新借用它,以使编译器清楚您不会永久地将其从 中取出output

trait Pure {
    fn pure(inputs: &[&[u8]], outputs: &mut[&mut [u8]]);
                                     // ^^^ add this
}

struct Identity {}

impl Pure for Identity {
    fn pure(inputs: &[&[u8]], outputs: &mut[&mut [u8]]) {
                                     // ^^^ add this
        let x: u32 = bincode::deserialize(inputs[0]).expect("input decode failed");
        bincode::serialize_into(&mut*outputs[0], &x).unwrap();
                             // ^^^^^ add this
    }
}

操场


推荐阅读