这个问题在这里已有答案:
我正在尝试编写一些数字模板函数,我发现了一些绊脚石。我最近发现的是以下代码:
extern crate num;
use num::Integer;
use num::Zero;
fn f<T: Integer>() -> T {
T::zero() + 1
}
fn main() {
let x: u32 = f();
println!("{}", x);
}
这不起作用,因为1
是一个“不匹配的类型”和编译器“期望的类型参数,找到了整数变量”。
现在,我知道T::zero() + T::one()
确实可以工作并“修复”上面的问题,但是如果我使用的数字文字没有像Zero
那样,如2,10,100呢?
FromPrimitive
或Num::from_str_radix
似乎符合您的需求。
extern crate num;
use num::{Integer, FromPrimitive};
fn f<T: Integer + FromPrimitive>() -> T {
T::zero() + T::from_i32(1).unwrap()
}
fn main() {
let x: u32 = f();
println!("{}", x);
}
要么
extern crate num;
use num::Integer;
fn f<T: Integer>() -> T {
T::zero() + T::from_str_radix("1", 10).ok().unwrap()
}
fn main() {
let x: u32 = f();
println!("{}", x);
}