Rust中如何正确将&mut i32转换为usize?代码报错咨询
问题解答
你遇到的报错是因为遍历&mut Vec<i32>类型变量时,for循环生成的迭代元素是可变引用&mut i32,而非i32值,直接将引用类型转换为usize不符合Rust的类型规则。以下是几种正确的处理方式:
方法1:解引用可变引用
通过*操作符解引用&mut i32,获取内部的i32值后再转换为usize:
pub fn sort_colors(nums: &mut Vec<i32>) { let mut cntColors = vec![0; 3]; for num in nums { cntColors[*num as usize] += 1; // 用*解引用拿到i32值 } }
注:Rust中一元解引用*的优先级高于类型转换as,所以*num as usize等价于(*num) as usize,两种写法都有效。
方法2:遍历不可变引用
如果不需要修改原数组元素,可以用iter()方法获取不可变引用的迭代器,同样通过解引用取值:
pub fn sort_colors(nums: &mut Vec<i32>) { let mut cntColors = vec![0; 3]; for num in nums.iter() { cntColors[*num as usize] += 1; } }
你用索引遍历的修复方式nums[idx]本质是通过索引直接访问数组元素(Rust会自动解引用),也是合法实现,但使用迭代器的写法更符合Rust的惯用风格。
内容的提问来源于stack exchange,提问作者mascai
相关产品推荐
相关产品推荐

