避免投射浮点常数

时间:2015-02-03 17:50:57

标签: casting rust

我创造的货物(除其他外)将实施惯用的角度测量。当创建在角度单位之间转换的方法时,我发现了问题:

impl<T> Angle<T>
where T: Float {
    pub fn to_deg(self) -> Self {
        Deg(match self {
            Rad(v) =>  v * cast(180.0 / f64::consts::PI).unwrap(),
            Deg(v) =>  v,
            Grad(v) => v * cast(180.0 / 200.0).unwrap() // how to get rid of this cast?
        })
    }
}

Runnable

180.0 / 200.0的演员对我来说真的不需要?有没有办法摆脱这个?

当我删除演员表时,我得到:

src/angles.rs:42:28: 42:33 error: mismatched types:
 expected `T`,
    found `_`
(expected type parameter,
    found floating-point variable) [E0308]
src/angles.rs:42             Grad(v) => v * 180.0 / 200.0
                                            ^~~~~

1 个答案:

答案 0 :(得分:0)

当您具有带有类型参数的泛型函数时,例如T您将无法选择类型。该类型是由函数的调用者强加给您的。

此处的错误是您试图将特定的f32 / f64类型分配给类型T的类型,该类型可以是实现的任何 Float

您知道在实践中它将是浮点类型之一,但是从理论上讲,类型系统不会阻止某人在字符串或数组或两个函数的元组上实现Float指针或其他任何无法分配浮点数的奇异事物。如果编译器不能保证它会一直工作,包括将来的理论上,那么它就不会接受。

如果要将浮点值分配给T,则必须声明此操作是可能的,例如通过添加f32: Into<T>并使用180f32.into()