如何从 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 在特征方面遵循开放世界假设。根据您的注释,它知道 p
是 BigInt
。它还知道 One::one()
有一个实现 One
的类型。所以 Rust 正在 BigInt
上寻找一个减法运算符,它接受一个类似于 One
的东西作为参数。
num::BigInt as std::ops::Sub<Foo>>
其中 Foo
实现 One
。问题是,BigInt
实现了 Sub
in several different ways,所以 Rust 不知道你是想减去 i32
、u64
还是另一个 BigInt
来自 p
.
一个答案是对你的类型更加明确。
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,提供后一种解决方案!)
我希望这个程序在执行时编译并打印 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 在特征方面遵循开放世界假设。根据您的注释,它知道 p
是 BigInt
。它还知道 One::one()
有一个实现 One
的类型。所以 Rust 正在 BigInt
上寻找一个减法运算符,它接受一个类似于 One
的东西作为参数。
num::BigInt as std::ops::Sub<Foo>>
其中 Foo
实现 One
。问题是,BigInt
实现了 Sub
in several different ways,所以 Rust 不知道你是想减去 i32
、u64
还是另一个 BigInt
来自 p
.
一个答案是对你的类型更加明确。
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,提供后一种解决方案!)