如何从 Rust 中的 BigInt 中减去 1?

use*_*725 2 biginteger rust

我希望这个程序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
Run Code Online (Sandbox Code Playgroud)

编译器错误是:

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
Run Code Online (Sandbox Code Playgroud)

Sil*_*olo 5

Rust 在特性方面遵循开放世界假设。据了解,根据您的注解,那p就是BigInt。它还知道它One::one()有一个实现One. 所以 Rust 正在寻找一个减法运算符,BigInt它以一个类似One的东西作为参数。

num::BigInt as std::ops::Sub<Foo>>
Run Code Online (Sandbox Code Playgroud)

在哪里Foo实现One。麻烦的是,BigInt农具Sub 几种不同的方式,所以锈不知道你是否尝试减去一个i32,一个u64或另一个BigIntp

一个答案是对您的类型更加明确。

let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let one: BigInt = One::one();
let q: BigInt = p - one;
Run Code Online (Sandbox Code Playgroud)

但是,更简洁地说,您可以利用以这种方式BigInt实现One并帮助编译器进行类型推断的事实。

let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - BigInt::one();
Run Code Online (Sandbox Code Playgroud)

(感谢@loganfsmyth,对于后一种解决方案!)