i have following code generates vector of bytes passed vector of enum values:
#[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), } } } // functions serialize bool/integer/etc. vec<u8> // ... impl serialize<berttuple> 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)) // <-- issue there? .collect(); let arity = data.values.len(); match arity { 0...255 => self.get_small_tuple(arity u8, binary), _ => self.get_large_tuple(arity i32, binary), } } }
but when compiling, receive error iterating around map
:
error: trait bound `std::vec::vec<u8>: std::iter::fromiterator<std::vec::vec<u8>>` not satisfied [e0277] .collect(); ^~~~~~~ help: run `rustc --explain e0277` see detailed explanation note: collection of type `std::vec::vec<u8>` cannot built iterator on elements of type `std::vec::vec<u8>` error: aborting due previous error error: not compile `bert-rs`.
how can fix issue std::iter::fromiterator
?
the problem enum_value_to_binary
returns vec<u8>
each element in values
. end iterator<item=vec<u8>>
, call collect::<vec<u8>>()
on that, doesn't know how flatten nested vectors. if want values flattened 1 vec<u8>
, should use flat_map
instead of map
:
let mut binary: vec<u8> = data.values .iter() .flat_map(|item| self.enum_value_to_binary(item).into_iter()) .collect();
or, more idiomatic , performant, can have enum_value_to_binary
return iterator directly.
also, iter
method returns iterator<item=&'a t>
, means borrowing elements, self.enum_value_to_binary
wants take ownership on value. there's couple of ways fix that. 1 option use into_iter
instead of iter
, give elements value. if that, you'll move arity
variable before binary
variable, since creating binary
variable take ownership (move) data.values
.
the other option change self.enum_value_to_binary
take it's argument reference.
also possible meant type of binary
vec<vec<u8>>
.
Comments
Post a Comment