繁体   English   中英

如何从Rust的BigInt中减去1?

[英]How does one subtract 1 from a BigInt in 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

编译器错误是:

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 ,因此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,这是后一种解决方案!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM