【问题标题】:How does one subtract 1 from a BigInt in Rust?如何从 Rust 中的 BigInt 中减去 1?
【发布时间】:2018-07-17 00:36:48
【问题描述】:

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

【问题讨论】:

  • BigInt::one() 可能是最简单的方法。
  • @loganfsmyth 这将比我的答案更聪明,更简单。我可以建议将其发布为答案吗?
  • @SilvioMayolo Nah 你应该把它添加到你的 :)

标签: rust biginteger


【解决方案1】:

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

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

其中Foo 实现One。麻烦的是,BigInt 实现了Sub in several different ways,所以Rust 不知道你是想从p 中减去i32、u64 还是另一个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,提供后一种解决方案!)

【讨论】:

  • 谢谢。我希望有一种比像您的解决方案那样声明 one 更简洁的方法。
  • 老实说,我自己对 Rust 还是有点陌生​​,所以我不知道所有的来龙去脉。我是一名 Haskeller,所以我从类型解析的角度来处理这个问题。
  • 类型是多余的。 let p = BigInt::from_usize(314159).unwrap(); let q = p - BigInt::one();.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多