rust - 在 Rust 中如何从 BigInt 中减 1?

标签 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();
  |                       ^

最佳答案

Rust 在特性方面遵循开放世界假设。根据您的注释,它知道 pBigInt。它还知道 One::one() 有一个实现 One 的类型。因此,Rust 正在 BigInt 上寻找一个减法运算符,它接受一个类似 One 的东西作为参数。

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

其中 Foo 实现 One。问题是,BigInt 实现了 Sub in several different ways ,因此 Rust 不知道您是否要尝试从 p< 中减去 i32u64 还是另一个 BigInt/.

一个答案是更明确地表达您的类型。

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,提供后一个解决方案!)

关于rust - 在 Rust 中如何从 BigInt 中减 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51371674/

相关文章:

casting - 非原始到 Rust 中的原始转换?

rust - 如何使用启用 Futures 的超 block 的 Serde 零拷贝反序列化来存储结果?

java - 我如何比较 BigInteger 的值以用作循环中的条件?

javascript - JavaScript 中的 2 ** 256 BigInteger

java - 将大字节数组转换为 double 变量中的自然数组

rust - 选择第一个 Some() 选项的惯用方式?

reference - 不能借用为可变的,因为它也被借用为不可变的

optimization - 为什么这段代码生成的汇编比等效的 C++/Clang 多得多?

algorithm - 大整数的 GCD 算法

math - 为什么 BigInteger 实现使用符号数值而不是二进制补码?