GitHub user ryansun96 closed a discussion: How to use builders in a loop to
build array of lists of structs?
I'm trying to use a loop to build an array of lists of structs, but have been
stuck with mutable borrow issues:
```rust
let mut list_builder =
ListBuilder::new(StructBuilder::from_fields(FieldsOfKeyAndValue, 0));
let struct_builder = list_builder.values();
// let key_builder = struct_builder.field_builder::<StringBuilder>(0).unwrap();
//Cannot do this due to only one mutable borrow allowed at a time;
// have to use workaround below
// let value_builder =
struct_builder.field_builder::<StringBuilder>(1).unwrap();
let (field_builder_key, field_builder_value) =
struct_builder.field_builders_mut().split_at_mut(1);
let key_builder =
field_builder_key[0].as_any_mut().downcast_mut::<StringBuilder>().unwrap();
let value_builder =
field_builder_value[0].as_any_mut().downcast_mut::<StringBuilder>().unwrap();
for (k, v) in Map:
key_builder.append_value(k);
value_builder.append_value(v);
struct_builder.append(true); // Compiler complains struct_builder and
list_builder have more than one mutable borrows
list_builder.append(true);
list_builder.finish()
```
I have seen chained calls being used elsewhere (e.g.
https://github.com/apache/datafusion/blob/33b86fe02e7bbe63135995c2dbb47bf83c08143c/datafusion/core/tests/dataframe/mod.rs#L5211),
however this would become very lengthy and unreadable for complex structures,
like the one in
https://docs.rs/arrow/latest/arrow/array/struct.StructBuilder.html . Is there
a better way to avoid the multiple mut borrow issue?
```rust
for _ in 0..num_points.max(2) {
// Add x value
points_builder
.values()
.field_builder::<Int32Builder>(0)
.unwrap()
.append_value(rng.random_range(-10..10));
// Add y value
points_builder
.values()
.field_builder::<Int32Builder>(1)
.unwrap()
.append_value(rng.random_range(-10..10));
points_builder.values().append(true);
```
GitHub link: https://github.com/apache/arrow-rs/discussions/9483
----
This is an automatically sent email for [email protected].
To unsubscribe, please send an email to: [email protected]