rust - 如何从 Rust 中的 BigInt 中减去 1?
问题描述
我希望这个程序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
-like 事物作为参数。
num::BigInt as std::ops::Sub<Foo>>
在哪里Foo
实现One
。麻烦的是,以几种不同的方式实现BigInt
,所以 Rust 不知道你是想从 中减去 a 、a还是另一个。Sub
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,后一种解决方案!)
推荐阅读
- wxwidgets - wxWidgets。根据命令在 wxAuiNotebook 中创建新页面
- ios - 如何“解包” ForEach 的内容
- javascript - 我想用 JavaScript 在 Canvas 中创建几个移动的圆圈
- reactjs - 如何通过服务器端渲染在 Next.js 中执行需要动态变量的 POST 请求?
- django - 双向一对五 django
- javascript - 如何在开始滚动时更改光标 css 属性,并在停止滚动时再次更改光标属性
- laravel - Laravel - 使用 env 方法读取 .env.testing 变量
- vue.js - SyntaxError: 不能在模块外使用 import 语句。VUE3/JSX/VantUI
- excel - 从多个文件复制垂直排列的表格,并将它们水平粘贴到主文件中
- c++ - 将原始指针列表存储在向量中的替代方法