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]

Reply via email to