Rust中修改嵌套Vec内部向量失败问题求助
Rust 修改嵌套 Vec<Vec> 不生效的问题解决
你期望给嵌套向量的每个内部向量末尾添加1,输入[[1,2],[3,4]]得到[[1,2,1],[3,4,1]],但编写的函数未生效,原代码如下:
fn add_numbers(mut row_matix: Vec<Vec<i64>>) { for mut row in row_matix { row.push(1) } }
问题原因
这段代码不生效的核心是所有权转移:
- 函数参数
mut row_matix: Vec<Vec<i64>>按值传入,外层Vec的所有权被转移到函数内部。 - 循环
for mut row in row_matix会进一步把每个内部Vec的所有权转移到row变量,你修改的只是这些被转移出来的副本,原外层Vec里的元素根本没被改动。函数执行结束后,副本会被销毁,原数据自然没有变化。
解决方案
方案1:使用可变引用修改原数据
将函数参数改为可变引用,直接操作原向量的内部元素,无需转移所有权:
fn add_numbers(row_matrix: &mut Vec<Vec<i64>>) { // 遍历可变引用,row 是内部 Vec 的可变引用 for row in row_matrix { row.push(1); } }
调用示例:
fn main() { let mut matrix = vec![vec![1, 2], vec![3, 4]]; add_numbers(&mut matrix); println!("{:?}", matrix); // 输出 [[1,2,1],[3,4,1]] }
方案2:返回修改后的新向量
如果不想使用引用,可以让函数接收原向量的所有权,修改后返回新的嵌套向量:
fn add_numbers(row_matrix: Vec<Vec<i64>>) -> Vec<Vec<i64>> { row_matrix.into_iter() .map(|mut row| { row.push(1); row }) .collect() }
调用示例:
fn main() { let matrix = vec![vec![1, 2], vec![3, 4]]; let modified_matrix = add_numbers(matrix); println!("{:?}", modified_matrix); // 输出 [[1,2,1],[3,4,1]] }
内容的提问来源于stack exchange,提问作者HWilmer
相关产品推荐
相关产品推荐

