结构的载体内借用

问题描述 投票:0回答:1

我有结构的载体,我想与另一个值,以更新一个结构。对于我的使用情况下,我宁愿做一个循环。我打了借位检查,但好像必须有一个简单的解决此类问题。

#[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);
    }
}
rust borrow-checker
1个回答
1
投票

您正在尝试设置电子表格矢量元素,而它内部的迭代。因为你总是想用spreadsheet[0].amountspreadsheet[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);
    }
}

Playground with using iter()

既然你想在做这些操作的循环,而不是迭代器可以改变spreadsheet.iter_mut()...代码块以下几点:

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

Playground with using for loop

© www.soinside.com 2019 - 2024. All rights reserved.