Rust实现LeetCode移除元素时for loop所有权错误的修复方法
修复LeetCode移除元素问题中的Rust所有权错误
问题描述
我要解决LeetCode上的移除元素问题,核心需求是移除数组中所有等于参数val的元素。用for loop实现时遇到了Rust所有权相关错误,错误信息如下:
Line 7, Char 17: cannot borrow
*numsas mutable because it is also borrowed as immutable (solution.rs)
|
for curr in nums.iter() { immutable borrow occurs here immutable borrow later used here if *curr != val { nums[insert_idx] = *curr; ^^^^ mutable borrow occurs here
我的代码如下:
impl Solution { pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 { let mut insert_idx: usize = 0; for curr in nums.iter() { if *curr != val { nums[insert_idx] = *curr; insert_idx += 1; } } return insert_idx as i32; } }
请问该如何修复这个错误?
错误原因
Rust的借用规则禁止同时存在对同一变量的可变借用与不可变借用。nums.iter()会创建一个持有nums不可变借用的迭代器,而循环内的nums[insert_idx] = *curr又尝试对nums发起可变借用,两者冲突导致编译错误。
修复方案
改用索引遍历的方式,避免同时持有持续的不可变借用:
impl Solution { pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 { let mut insert_idx: usize = 0; for i in 0..nums.len() { if nums[i] != val { nums[insert_idx] = nums[i]; insert_idx += 1; } } insert_idx as i32 } }
说明
- 索引遍历每次通过
nums[i]访问元素,每次访问都是独立的临时借用,不会形成持续的不可变借用,因此可以和nums[insert_idx]的可变借用共存。 - 另外,Rust中函数末尾的
return可以省略,直接返回表达式结果更符合惯用写法。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

