rust - 如何序列化为切片数组?
问题描述
假设我有一个代表纯函数的特征;为输出提供了内存,输入和输出都应该是 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
解决方案
您的代码有两个问题。首先,如果您希望能够改变内部引用,那么您必须有一个可变的外部引用。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
}
}