我创造的货物(除其他外)将实施惯用的角度测量。当创建在角度单位之间转换的方法时,我发现了问题:
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?
})
}
}
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
^~~~~
答案 0 :(得分:0)
当您具有带有类型参数的泛型函数时,例如T
,您将无法选择类型。该类型是由函数的调用者强加给您的。
此处的错误是您试图将特定的f32
/ f64
类型分配给类型T
的类型,该类型可以是实现的任何 Float
。
您知道在实践中它将是浮点类型之一,但是从理论上讲,类型系统不会阻止某人在字符串或数组或两个函数的元组上实现Float
指针或其他任何无法分配浮点数的奇异事物。如果编译器不能保证它会一直工作,包括将来的理论上,那么它就不会接受。
如果要将浮点值分配给T
,则必须声明此操作是可能的,例如通过添加f32: Into<T>
并使用180f32.into()
。