You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改按引用传递的Rust Vector问题求助

Rust Vec 修改与排序问题修复

你的代码存在语法和所有权相关的问题,以下是修复后的版本及问题说明:

问题点分析

  • 交换语句语法错误:bubble_sort中交换元素时,不需要用let声明数组下标赋值,直接赋值即可。
  • 参数声明错误:populate函数的参数mut &factors: Vec<i32>不符合Rust语法,要修改外部传入的Vec,需要使用可变引用&mut Vec<i32>。
  • 所有权传递问题:如果bubble_sort接收Vec<i32>会转移所有权,导致populate中后续无法操作原Vec,因此bubble_sort也应该接收可变引用来修改原数据。

修复后的代码

fn bubble_sort(arr: &mut Vec<i32>) {
    let mut swapped = true;
    while swapped {
        swapped = false;
        // 使用saturating_sub避免数组长度为0时的溢出问题
        for i in 0..arr.len().saturating_sub(1) {
            if arr[i] > arr[i + 1] {
                // 直接交换元素,无需多余的let声明
                let tmp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = tmp;
                swapped = true;
            }
        }
    }
}

fn populate(n: i32, factors: &mut Vec<i32>) {
    factors.push(2);
    factors.push(2);
    factors.push(n);
    factors.push(41);
    // 传递可变引用给排序函数,修改原Vec
    bubble_sort(factors);
}

fn main() {
    let mut factors: Vec<i32> = Vec::new();
    // 传递可变引用给populate函数
    populate(164, &mut factors);
    println!("Factors {:?}", factors);
}

关键修改说明

  1. bubble_sort参数改为可变引用:&mut Vec<i32>允许函数修改传入的Vec,同时保留所有权在调用方。
  2. 修正交换逻辑:去掉赋值语句前的let,直接操作数组元素;也可以用arr.swap(i, i+1)简化交换操作。
  3. populate参数修正为可变引用:正确声明参数类型,确保能修改main中定义的Vec。
  4. 调用时传递可变引用:main中调用populate时使用&mut factors,符合Rust的借用规则。

运行修复后的代码,输出结果为:Factors [2, 2, 41, 164],完全满足修改Vec并排序的需求。

内容的提问来源于stack exchange,提问作者Fred

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 21:13:28