首页 > 解决方案 > 如何从 Rust 中的 BigInt 中减去 1?

问题描述

我希望这个程序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();
  |                       ^

标签: rustbiginteger

解决方案


Rust 在特性方面遵循开放世界假设。它知道,根据您的注释,pBigInt. 它还知道One::one()具有实现的类型One。因此,Rust 正在寻找一个减法运算符,该运算符BigIntOne-like 事物作为参数。

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

在哪里Foo实现One。麻烦的是,以几种不同的方式实现BigInt,所以 Rust 不知道你是想从 中减去 a 、a还是另一个。Sub i32u64BigIntp

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

let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let one: BigInt = One::one();
let q: BigInt = p - one;

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

let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - BigInt::one();

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


推荐阅读