我有一个代码可以计算向量中仅包含 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
的正确方法是什么?
因此,如果您尝试编译代码,您会从编译器收到此错误消息:
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
,而不是引用本身。