修改按引用传递的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); }
关键修改说明
bubble_sort参数改为可变引用:&mut Vec<i32>允许函数修改传入的Vec,同时保留所有权在调用方。- 修正交换逻辑:去掉赋值语句前的
let,直接操作数组元素;也可以用arr.swap(i, i+1)简化交换操作。 populate参数修正为可变引用:正确声明参数类型,确保能修改main中定义的Vec。- 调用时传递可变引用:
main中调用populate时使用&mut factors,符合Rust的借用规则。
运行修复后的代码,输出结果为:Factors [2, 2, 41, 164],完全满足修改Vec并排序的需求。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

