【问题标题】:What trait can be used for scalar casts?什么特征可用于标量强制转换?
【发布时间】:2016-12-24 15:19:40
【问题描述】:

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

【问题讨论】:

标签: casting rust traits primitive-types


【解决方案1】:

有一个名为num 的箱子,它提供了一些你提到的特性。您可以找到文档here。在您的特定情况下,您似乎应该能够使用 One 特征。然而,这个特性非常有限,因为它只提供一个功能:

pub trait One: Mul<Self, Output=Self> {
    fn one() -> Self;
}

根据您要执行的操作,您最好使用Num 特征,它是Zero&lt;Output=Self&gt; + One&lt;Output=Self&gt; + Add&lt;Self&gt; + Sub&lt;Self, Output=Self&gt; + Mul&lt;Self&gt; + Div&lt;Self, Output=Self&gt; + Rem&lt;Self, Output=Self&gt; + PartialEq&lt;Self&gt; 的子特征。

这两个特征都是针对原始数值类型(usizeu8u16u32u64isizei8i16i32、@ 987654338@、f32f64)。但是请注意,它们也适用于库中定义的某些类型(BigIntBigUintRatioComplex)。

【讨论】:

    【解决方案2】:

    回答您提出的问题:

    什么特征可用于标量转换?

    没有。特征仅定义方法和关联类型。标量转换内置于语言中,不可扩展。

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

    【讨论】:

    • SyncCopy 之类的特征不就是“魔法”吗?如果是这样,我认为期待一个神奇的Primitive 特质是不合理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2012-02-10
    • 2022-01-22
    • 2023-03-12
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多