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

Rust实现LeetCode移除元素时for loop所有权错误的修复方法

修复LeetCode移除元素问题中的Rust所有权错误

问题描述

我要解决LeetCode上的移除元素问题,核心需求是移除数组中所有等于参数val的元素。用for loop实现时遇到了Rust所有权相关错误,错误信息如下:

Line 7, Char 17: cannot borrow *nums as 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:47:28