代码之家  ›  专栏  ›  技术社区  ›  goertzenator

使用泛型类型时如何使用浮点数文本?

  •  2
  • goertzenator  · 技术社区  · 7 年前

    常规浮动文字不起作用:

    extern crate num_traits;
    
    use num_traits::float::Float;
    
    fn scale_float<T: Float>(x: T) -> T {
        x * 0.54
    }
    
    fn main() {
        let a: f64 = scale_float(1.23);
    }
    
    error[E0308]: mismatched types
     --> src/main.rs:6:9
      |
    6 |     x * 0.54
      |         ^^^^ expected type parameter, found floating-point variable
      |
      = note: expected type `T`
                 found type `{float}`
    
    3 回复  |  直到 7 年前
        1
  •  3
  •   Shepmaster Tim Diekmann    7 年前

    FromPrimitive trait

    use num_traits::{cast::FromPrimitive, float::Float};
    
    fn scale_float<T: Float + FromPrimitive>(x: T) -> T {
        x * T::from_f64(0.54).unwrap()
    }
    

    From Into

    fn scale_float<T>(x: T) -> T
    where
        T: Float,
        f64: Into<T>
    {
        x * 0.54.into()
    }
    

        2
  •  1
  •   mcarton    7 年前

    Float FloatConst

    trait SomeDomainSpecificScaleFactor {
        fn factor() -> Self;
    }
    
    impl SomeDomainSpecificScaleFactor for f32 {
        fn factor() -> Self {
            0.54
        }
    }
    
    impl SomeDomainSpecificScaleFactor for f64 {
        fn factor() -> Self {
            0.54
        }
    }
    
    fn scale_float<T: Float + SomeDomainSpecificScaleFactor>(x: T) -> T {
        x * T::factor()
    }
    

    link to playground

        3
  •  0
  •   Shepmaster Tim Diekmann    7 年前

    f64 T Mul<f64, Output = T>

    use num_traits::float::Float; // 0.2.6
    use std::ops::Mul;
    
    fn scale_float<T>(x: T) -> T
    where
        T: Float + Mul<f64, Output = T>,
    {
        x * 0.54
    }
    
    fn main() {
        let a: f64 = scale_float(1.23);
    }