Заимствование внутри вектора структур - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть вектор структур, и я хотел бы обновить одну структуру со значениями в другой.В моем случае я предпочитаю делать это в цикле.Я запускаю программу проверки заимствований, но, похоже, решение этой проблемы должно быть простым.

#[derive(Debug)]
struct Column {
    header: String,
    amount: i32,
}

fn main() {
    let mut spreadsheet: Vec<Column> = Vec::new();

    spreadsheet.push(Column {
        header: "Car".to_string(),
        amount: 30300,
    });
    spreadsheet.push(Column {
        header: "House".to_string(),
        amount: 210800,
    });
    spreadsheet.push(Column {
        header: "Total".to_string(),
        amount: 0,
    });

    for column in &mut spreadsheet {
        //mutable borrow here
        if column.header == "Total" {
            column.amount = spreadsheet[0].amount //immutable borrow here
                        + spreadsheet[1].amount;
        } else {
            column.amount -= 300;
        }
    }

    for column in spreadsheet {
        println!("{:?}", column);
    }
}

1 Ответ

0 голосов
/ 08 февраля 2019

Вы пытаетесь установить элемент вектора электронной таблицы, повторяя его внутри.Поскольку вы всегда хотите использовать spreadsheet[0].amount и spreadsheet[1].amount, вы можете клонировать эти значения в другую переменную и работать с ними вместо использования их внутри электронной таблицы.

Вот рабочий код:

#[derive(Debug)]
struct Column {
    header: String,
    amount: i32,
}

fn main() {
    let mut spreadsheet: Vec<Column> = Vec::new();

    spreadsheet.push(Column {
        header: "Car".to_string(),
        amount: 30300,
    });
    spreadsheet.push(Column {
        header: "House".to_string(),
        amount: 210800,
    });
    spreadsheet.push(Column {
        header: "Total".to_string(),
        amount: 0,
    });

    let car_amount = spreadsheet[0].amount;
    let header_amount = spreadsheet[1].amount;

    spreadsheet.iter_mut().for_each(|column| {
        if column.header == "Total" {
            column.amount = car_amount + header_amount;
        } else {
            column.amount -= 300;
        }
    });

    for column in spreadsheet {
        println!("{:?}", column);
    }
}

Игровая площадка с использованием iter()

Поскольку вы хотите выполнять эти операции в цикле for вместо итератора, вы можете изменить кодовый блок spreadsheet.iter_mut()... на следующий:

for column in &mut spreadsheet {
    if column.header == "Total" {
        column.amount = car_amount + header_amount;
    } else {
        column.amount -= 300;
    }
}

Детская площадка с использованием for loop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...