Rust类型不匹配错误求助:expected `usize`, found `i64`
解决Rust中类型不匹配(
usize vs i64)的问题 这问题我之前也碰到过,咱们一步步拆解解决:
你的代码
fn main() { let mut a: Vec<i64> = Vec::new(); let n = 42; a.push(n); let i = 0; a[i]; let j = n; i == j; }
报错信息
error[E0308]: mismatched types
--> src/main.rs:4:10
| 4 | i == j;
| ^ expected usize, foundi64
问题核心
Rust是强类型语言,不同数字类型不能直接比较。这里的矛盾点很明确:
let i = 0;没有指定类型,但你用它作为Vec的索引,Rust会自动把i推断为usize(Vec的索引必须是这个类型,对应系统的指针宽度)let j = n;而n被推断为i64(因为你把它push到了Vec<i64>里),所以j也是i64类型
两边类型不统一,编译器自然会报错。
两种修复方案
根据你的实际业务需求,选一种就行:
方案1:把j转换成usize类型
如果你希望j和i一样作为索引使用,直接显式转换类型:
fn main() { let mut a: Vec<i64> = Vec::new(); let n = 42; a.push(n); let i = 0; a[i]; let j: usize = n as usize; // 这里把i64转成usize i == j; }
⚠️ 注意:如果n是负数,转usize会触发溢出错误,但你的例子里n=42是正数,完全没问题。
方案2:把i设为i64,访问Vec时临时转usize
如果你需要i保持i64类型,那访问Vec的时候临时转换索引类型,这样比较时两边都是i64:
fn main() { let mut a: Vec<i64> = Vec::new(); let n = 42; a.push(n); let i: i64 = 0; // 显式指定i为i64 a[i as usize]; // 访问Vec时转成usize索引 let j = n; i == j; // 现在类型统一,可正常比较 }
内容的提问来源于stack exchange,提问作者Shisui Uchiha
相关产品推荐
相关产品推荐

