我可以将T
限制为什么特性以允许编译?
fn one<T>() -> T {
1.0 as _
}
fn main() {
println!("{}", one::<i8>());
}
按原样,它会出现此错误:
rustc 1.14.0 (e8a012324 2016-12-16)
error: non-scalar cast: `f64` as `T`
--> <anon>:2:5
|
2 | 1.0 as _
| ^^^^^^^^
一个好的解决方案是将T
限制为原始数字类型(i8
,f64
等)的特征。我找到了std::num::Primitive
,但它显然是实验性的,而夜间编译器无论如何都找不到它。
答案 0 :(得分:2)
有一个名为num的箱子,它提供了一些你提到的特征。您可以找到文档here。在您的特定情况下,您似乎应该能够使用One
特征。然而,这种特性非常有限,因为它只提供一种功能:
pub trait One: Mul<Self, Output=Self> {
fn one() -> Self;
}
根据您的目的,您最好使用Num
特征,这是Zero<Output=Self> + One<Output=Self> + Add<Self> + Sub<Self, Output=Self> + Mul<Self> + Div<Self, Output=Self> + Rem<Self, Output=Self> + PartialEq<Self>
的子特征。
两种特征都是针对原始数字类型实现的(usize
,u8
,u16
,u32
,u64
,isize
,{ {1}},i8
,i16
,i32
,i64
,f32
)。但请注意,它们也是针对库中定义的某些类型实现的(f64
,BigInt
,BigUint
,Ratio
)。
答案 1 :(得分:2)