我需要在不同功能中使用可变引用的帮助

时间:2019-07-17 09:32:44

标签: rust

我正在学习防锈,所以有些事情看似容易,但我听不懂。

我需要具有incomeexpenses变量来更改它们的值,通常我会使用static变量并在unsafe块中分配值。

代码如下:

fn expense_sum(expense_list: &Vec<u64>, expenses: &mut u64) {
    expenses = &mut (expense_list.iter().sum());
}

fn prompt_expense(expense_list: &mut Vec<u64>, expense_name: &mut Vec<String>, expenses: &mut u64) {
    let expense_input: u64 = 1;
    expense_list.push(expense_input);

    let expense_name1: String = "test1".to_string();

    expense_name.push(expense_name1);

    expense_sum(&expense_list, expenses);
    println!("Total user expenses: {}", expenses);
}

fn main() {
    let mut expense_list: Vec<u64> = Vec::new();
    let mut expense_name: Vec<String> = Vec::new();
    let mut expenses: u64;

    loop {
        prompt_expense(&mut expense_list, &mut expense_name, &mut expenses);
        // USe income and expenses here for analysis
    }
}

我已经通过多种方式进行了测试,但是我无法成功地将变量传递给expense_sumincome_sum

1 个答案:

答案 0 :(得分:2)

这基本上是正确的;他们唯一阻止构建的真正问题在这里:

fn expense_sum(expense_list: &Vec<u64>, expenses: &mut u64) {
    expenses = &mut (expense_list.iter().sum());
}

此语法尝试分配引用,而不是修改引用的实际值。您需要取消引用,然后只需分配:

*expenses = expense_list.iter().sum();

话虽如此,这是不好的做法。最好使用...函数的返回值简单地返回值:

fn expense_sum(expense_list: &Vec<u64>) -> u64 {
    expense_list.iter().sum()
}

这样,代码更短,更易读,并且避免了所有不必要的引用处理。您需要以类似的方式修改prompt_expense函数。