标量演员可以使用什么特质?

时间:2016-12-24 15:19:41

标签: casting rust traits primitive-types

我可以将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限制为原始数字类型(i8f64等)的特征。我找到了std::num::Primitive,但它显然是实验性的,而夜间编译器无论如何都找不到它。

2 个答案:

答案 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>的子特征。

两种特征都是针对原始数字类型实现的(usizeu8u16u32u64isize,{ {1}},i8i16i32i64f32)。但请注意,它们也是针对库中定义的某些类型实现的(f64BigIntBigUintRatio)。

答案 1 :(得分:2)

回答你问的问题:

  

标量演员可以使用什么特质?

无。特征仅定义方法和相关类型。标量强制转换是内置于语言中的,不能用于扩展。

aochagavia has answered“我该如何解决这个问题”。