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