rust - 我需要帮助在不同的函数中使用可变引用

标签 rust

我正在学习 Rust,所以有些事情看起来很明显和容易,但有些事情我无法理解。

我需要有 incomeexpenses 变量来更改它们的值,通常我会使用 static 变量并在 中赋值code>unsafe block 。

代码如下:

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

最佳答案

这大部分是正确的;他们唯一阻止它构建的真正问题是:

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 函数。

关于rust - 我需要帮助在不同的函数中使用可变引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57072743/

相关文章:

multithreading - 在 Rust 中,如何创建在其自己的操作系统线程中运行的任务?

operator-overloading - 如何在Rust中为值和引用实现惯用运算符重载?

rust - 使用 "Serde"反序列化时可以映射类型吗?

Rust MemWriter 返回指向 Buffer 的指针

testing - 如何将 Quickcheck 生成的 float 限制在一个范围内?

algorithm - 如何将集合的元素分组为N个部分的所有组合?

string - "Borrowed value does not live long enough", 在循环中使用时丢弃

file - 如何使用 Rust 创建二进制文件?

c - 为什么当静态没有链接时const在链接过程中消失?

rust - Actix TCP客户端实现的编译问题