我希望该程序在执行时编译并打印314158
:
extern crate num;
use num::{BigInt, FromPrimitive, One};
fn main() {
let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - One::one();
println!("q = {}", q);
} // end main
编译器错误为:
error[E0284]: type annotations required: cannot resolve `<num::BigInt as std::ops::Sub<_>>::Output == num::BigInt`
--> src/main.rs:7:23
|
7 | let q: BigInt = p - One::one();
| ^
答案 0 :(得分:2)
关于特质,铁锈遵循开放世界的假设。根据您的注释,它知道p
是BigInt
。还知道One::one()
具有实现One
的类型。因此,Rust正在BigInt
上寻找一个减法运算符,该运算符采用类似One
的东西作为参数。
num::BigInt as std::ops::Sub<Foo>>
其中Foo
实现One
。麻烦的是,BigInt
实现了Sub
in several different ways,因此Rust不知道您是要减去i32
,u64
还是另一个{ BigInt
中的{1}}。
一个答案是要更明确地说明您的类型。
p
但是,更简洁地说,您可以利用let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let one: BigInt = One::one();
let q: BigInt = p - one;
实现BigInt
的事实,并以这种方式帮助编译器进行类型推断。
One
(感谢@loganfsmyth,提供后一种解决方案!)