我希望这个程序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
Run Code Online (Sandbox Code Playgroud)
编译器错误是:
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
Run Code Online (Sandbox Code Playgroud)
Rust 在特性方面遵循开放世界假设。据了解,根据您的注解,那p就是BigInt。它还知道它One::one()有一个实现One. 所以 Rust 正在寻找一个减法运算符,BigInt它以一个类似One的东西作为参数。
num::BigInt as std::ops::Sub<Foo>>
Run Code Online (Sandbox Code Playgroud)
在哪里Foo实现One。麻烦的是,BigInt农具Sub 几种不同的方式,所以锈不知道你是否尝试减去一个i32,一个u64或另一个BigInt从p。
一个答案是对您的类型更加明确。
let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let one: BigInt = One::one();
let q: BigInt = p - one;
Run Code Online (Sandbox Code Playgroud)
但是,更简洁地说,您可以利用以这种方式BigInt实现One并帮助编译器进行类型推断的事实。
let p: BigInt = FromPrimitive::from_usize(314159).unwrap();
let q: BigInt = p - BigInt::one();
Run Code Online (Sandbox Code Playgroud)
(感谢@loganfsmyth,对于后一种解决方案!)
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |