如何从Rust的BigInt中减去1?

时间:2018-07-17 00:36:48

标签: rust biginteger

我希望该程序在执行时编译并打印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();
  |                       ^

1 个答案:

答案 0 :(得分:2)

关于特质,铁锈遵循开放世界的假设。根据您的注释,它知道pBigInt。还知道One::one()具有实现One的类型。因此,Rust正在BigInt上寻找一个减法运算符,该运算符采用类似One的东西作为参数。

num::BigInt as std::ops::Sub<Foo>>

其中Foo实现One。麻烦的是,BigInt实现了Sub in several different ways,因此Rust不知道您是要减去i32u64还是另一个{ BigInt中的{1}}。

一个答案是要更明确地说明您的类型。

p

但是,更简洁地说,您可以利用let p: BigInt = FromPrimitive::from_usize(314159).unwrap(); let one: BigInt = One::one(); let q: BigInt = p - one; 实现BigInt的事实,并以这种方式帮助编译器进行类型推断。

One

(感谢@loganfsmyth,提供后一种解决方案!)