错误:将 `&mut i32` 转换为 `usize` 无效

问题描述 投票:0回答:1

我有一个代码可以计算向量中仅包含 0、1、2 个值的元素数量

    pub fn sort_colors(nums: &mut Vec<i32>) {
        let mut cntColors = vec![0; 3];
        
        for num in nums {
            cntColors[(num) as usize] += 1; // ERROR: casting `&mut i32` as `usize` is invalid
        }

我在这段代码的帮助下修复了错误

        for idx in 0..nums.len() {
            cntColors[nums[idx] as usize] += 1;
        }

&mut i32
投射到
usize
的正确方法是什么?

rust
1个回答
0
投票

因此,如果您尝试编译代码,您会从编译器收到此错误消息:

error[E0606]: casting `&mut i32` as `usize` is invalid
 --> src\main.rs:7:19
  |
7 |         cntColors[(num) as usize] += 1;
  |                   ^^^^^^^^^^^^^^
  |
help: dereference the expression
  |
7 |         cntColors[*(num) as usize] += 1;
  |                   +

因此,如果我们按照编译器的建议进行操作并在

*
之前插入
num
,我们会得到

pub fn sort_colors(nums: &mut Vec<i32>) {
    let mut cntColors = vec![0; 3];
    
    for num in nums {
        cntColors[*num as usize] += 1;
    }

}

效果很好。 这里的主要课程是实际阅读从编译器获得的消息,但我还将为这里发生的事情提供更详细的解释。

由于

nums
具有类型
&mut Vec<i32>
,即对
i32
向量的可变引用。 当我们在
for
循环中使用它时,我们看到的元素本身就是对向量元素的引用。 他们的类型是
&mut i32
。 因此,为了用它来索引另一个序列,我们需要一个
usize
。 因此,第一步是使用解引用运算符
&mut i32
i32
解引用为
*
,然后我们可以使用
usize
将其转换为
as
。 因此,如果
num
具有类型
&mut i32
,则
*num
具有类型
i32
,并且
*num as usize
具有类型
usize

解决此问题的另一种方法是这样做:

pub fn sort_colors(nums: &mut Vec<i32>) {
    let mut cntColors = vec![0; 3];
    
    for &mut num in nums {
        cntColors[num as usize] += 1;
    }

}

这使用模式绑定来解构

&mut i32
,以便
num
实际上指的是引用后面的
i32
,而不是引用本身。

© www.soinside.com 2019 - 2024. All rights reserved.