[英]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
,因此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,這是后一種解決方案!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.