可以用哪些特性进行标量类型转换?

3

我应该限制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,但它显然是实验性的,而且夜间编译器也找不到它。

重复的问题:http://stackoverflow.com/q/29025811/155423;https://dev59.com/4l0Z5IYBdhLWcg3w4zom;https://dev59.com/3F4b5IYBdhLWcg3waA1P;https://dev59.com/-Irda4cB1Zd3GeqPNIHt;https://dev59.com/IYrda4cB1Zd3GeqPM3ts;https://dev59.com/-2Ei5IYBdhLWcg3wptp_;https://dev59.com/gFoU5IYBdhLWcg3wlHwg;等等。 - Shepmaster
谢谢提供链接。有很多类似的问题(也许是改进书籍的机会!)。我认为最有帮助的答案是这个 - Timmmm
2个回答

2

回答你所提出的问题:

哪个特征可以用于标量强制转换?

没有。特征只定义方法和相关类型。标量强制转换是内置于语言中的,不开放扩展。

aochagavia已经回答了“如何解决这个问题”。


有一些特质像SyncCopy不是很"神奇"吗?如果是这样的话,我认为期望一个神奇的Primitive特质并不是不合理的。 - Timmmm

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> 的子特质。

这两个特质都针对原始数字类型(usizeu8u16u32u64isizei8i16i32i64f32f64)实现。然而,请注意,它们还为库中定义的某些类型(BigIntBigUintRatioComplex)实现了这两个特质。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接