我正在学习防锈,所以有些事情看似容易,但我听不懂。
我需要具有income
和expenses
变量来更改它们的值,通常我会使用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_sum
和income_sum
答案 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
函数。