Rust中BigUint移位操作类型推断失败问题咨询
问题解答
代码与报错
原代码
use num_bigint::BigUint; use num_traits::{ToPrimitive}; fn main() { let x = BigUint::parse_bytes(b"123", 10).unwrap(); let y = x >> 2; let z = y.to_u64(); println!("{:}", y); }
编译器报错
7 | let z = y.to_u64(); | ^ cannot infer type
为什么无法推断移位后的类型是BigUint?
Rust的移位运算符>>是通过std::ops::Shr trait实现的,这个 trait 定义了关联类型Output——也就是移位操作的返回类型。BigUint的Shr实现并没有将Output固定为BigUint,存在多种可能的输出类型实现。
当你写x >> 2时,编译器需要根据后续上下文推断Output的具体类型,但此时y仅调用了to_u64(),而很多类型都实现了ToPrimitive trait的to_u64方法,编译器无法唯一确定移位结果的类型,因此抛出类型推断失败的错误。
给y标注BigUint类型后,相当于直接告知编译器Shr的Output就是BigUint,类型明确后编译就能正常进行。
无需新变量的解决方法
以下几种方式可以直接对x >> 2调用方法,无需额外创建带类型标注的变量:
方法1:明确指定ToPrimitive的实现类型
通过全限定语法调用BigUint的to_u64方法,让编译器明确移位结果必须是BigUint:
use num_bigint::BigUint; use num_traits::{ToPrimitive}; fn main() { let x = BigUint::parse_bytes(b"123", 10).unwrap(); let z = <BigUint as ToPrimitive>::to_u64(& (x >> 2)).unwrap(); println!("{:}", x >> 2); }
方法2:使用turbofish指定Shr的输出类型
直接调用Shr trait的shr方法,并用turbofish明确输出类型为BigUint:
use num_bigint::BigUint; use num_traits::{ToPrimitive}; use std::ops::Shr; fn main() { let x = BigUint::parse_bytes(b"123", 10).unwrap(); let z = Shr::<_, BigUint>::shr(x, 2).to_u64(); println!("{:}", Shr::<_, BigUint>::shr(x.clone(), 2)); }
方法3:使用inline let(Rust 1.65+)
如果你的Rust版本在1.65及以上,可以用inline let在表达式内直接标注类型,无需额外变量:
use num_bigint::BigUint; use num_traits::{ToPrimitive}; fn main() { let x = BigUint::parse_bytes(b"123", 10).unwrap(); let z = (let y: BigUint = x >> 2; y).to_u64(); println!("{:}", (let y: BigUint = x >> 2; y)); }
内容的提问来源于stack exchange,提问作者anon2328
相关产品推荐
相关产品推荐

