gpt4 book ai didi

serialization - 将枚举值向量转换为另一个向量

转载 作者:行者123 更新时间:2023-11-29 08:16:36 25 4
gpt4 key购买 nike

我有以下代码,它根据传递的枚举值向量生成字节向量:

#[derive(Debug, PartialEq)]
pub enum BertType {
SmallInteger(u8),
Integer(i32),
Float(f64),
String(String),
Boolean(bool),
Tuple(BertTuple),
}

#[derive(Debug, PartialEq)]
pub struct BertTuple {
pub values: Vec<BertType>
}

pub struct Serializer;

pub trait Serialize<T> {
fn to_bert(&self, data: T) -> Vec<u8>;
}

impl Serializer {
fn enum_value_to_binary(&self, enum_value: BertType) -> Vec<u8> {
match enum_value {
BertType::SmallInteger(value_u8) => self.to_bert(value_u8),
BertType::Integer(value_i32) => self.to_bert(value_i32),
BertType::Float(value_f64) => self.to_bert(value_f64),
BertType::String(string) => self.to_bert(string),
BertType::Boolean(boolean) => self.to_bert(boolean),
BertType::Tuple(tuple) => self.to_bert(tuple),
}
}
}

// some functions for serialize bool/integer/etc. into Vec<u8>
// ...

impl Serialize<BertTuple> for Serializer {
fn to_bert(&self, data: BertTuple) -> Vec<u8> {
let mut binary: Vec<u8> = data.values
.iter()
.map(|&item| self.enum_value_to_binary(item)) // <-- what the issue there?
.collect();

let arity = data.values.len();
match arity {
0...255 => self.get_small_tuple(arity as u8, binary),
_ => self.get_large_tuple(arity as i32, binary),
}
}
}

但是在编译时,我收到关于遍历 map 的错误:

error: the trait bound `std::vec::Vec<u8>: std::iter::FromIterator<std::vec::Vec<u8>>` is not satisfied [E0277]
.collect();
^~~~~~~
help: run `rustc --explain E0277` to see a detailed explanation
note: a collection of type `std::vec::Vec<u8>` cannot be built from an iterator over elements of type `std::vec::Vec<u8>`
error: aborting due to previous error
error: Could not compile `bert-rs`.

如何使用 std::iter::FromIterator 解决这个问题?

最佳答案

问题是 enum_value_to_binary返回 Vec<u8>对于 values 中的每个元素.所以你最终得到一个 Iterator<Item=Vec<u8>>你调用collect::<Vec<u8>>()在那上面,但它不知道如何展平嵌套向量。如果您希望将所有值展平为一个 Vec<u8> , 那么你应该使用 flat_map而不是 map :

let mut binary: Vec<u8> = data.values
.iter()
.flat_map(|item| self.enum_value_to_binary(item).into_iter())
.collect();

或者,稍微更加地道和高效,您可以只使用 enum_value_to_binary直接返回一个迭代器。

另外,iter方法返回 Iterator<Item=&'a T> ,这意味着您只是借用元素,但是 self.enum_value_to_binary想要获得值(value)的所有权。有几种方法可以解决这个问题。一种选择是使用 into_iter而不是 iter ,这将按值为您提供元素。如果你这样做,你将移动 arity直到 binary 之前的变量变量,自创建 binary变量将取得所有权(移动)data.values .

另一种选择是更改 self.enum_value_to_binary通过引用来理解它的论点。

也有可能你指的是 binary 的类型实际上是Vec<Vec<u8>> .

关于serialization - 将枚举值向量转换为另一个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837105/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com