Search code examples
rustrust-polars

Rust cannot borrow `var` as mutable, as it is behind a `&` reference using zip


The code is:

fn iter_and_make_feature_dataframe(df: &DataFrame) {
    // iter over rows
    // let columns = columns.unwrap_or(vec![]);
    let col_len = df.shape().1;
    let columns = df.get_column_names();

    let mut df = df.clone();
    df.as_single_chunk();

    let mut iters = df.iter().map(|s| s.iter()).collect::<Vec<_>>();

    let mut row: Vec<Vec<String>> = Vec::new();
    for row_idx in 0..df.height() {
        let mut c_row: Vec<String> = Vec::new();
        for iter in &mut iters.iter().zip(&columns) {
            let (value_iter, col_name) = iter;
            let value = value_iter
                .next()
                .expect("should have as many iterations as rows")
                .to_string();
            c_row.push(value);
        }

        // process row
    }
}

rust analyzer said :

error[E0596]: cannot borrow `*value_iter` as mutable, as it is behind a `&` reference
  --> src/main.rs:24:25
   |
23 |               let (value_iter, col_name) = iter;
   |                    ---------- consider changing this binding's type to be: `&mut SeriesIter<'_>`
24 |               let value = value_iter
   |  _________________________^
25 | |                 .next()
   | |_______________________^ `value_iter` is a `&` reference, so the data it refers to cannot be borrowed as mutable

How can I fix this? I want to process a dataframe row by row and make a new dataframe with the processed rows.


Solution

  • You need to use iter_mut() instead of iter() to advance the iterators:

    for iter in iters.iter_mut().zip(&columns) {
        // ...
    }