如何使用Float特性访问数字常量?

w17*_*7us 2 generics constants rust

我想在Rust中编写通用数学代码.类型f32f64已定义常量.例如π是std::f32::consts::PI.

我知道这个Float特性提供了常见的功能,但是常量呢?

我的尝试:

extern crate num;

use self::num::traits::Float;

fn f<T: Float>(t: T) -> T { 
    T::consts::PI * t 
}   

fn main() {
    let x = 5.0f32;
    println!("Result: {}", f(x));
}   
Run Code Online (Sandbox Code Playgroud)

收益率:

main.rs:6:5: 6:18 error: associated type `consts` not found for `T` [E0220]
main.rs:6     T::consts::PI * t
              ^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

如果这不可能,那么我如何使用泛型类型访问数学常量T

She*_*ter 5

这是一个称为关联常量的功能.似乎num 0.1.41没有使用任何这样的常量,但你可以Float像这样增加特征:

extern crate num;

trait FloatConst: num::Float {
    const PI: Self;
    const E: Self;
}

impl FloatConst for f32 {
    const PI: f32 = 3.14;
    const E: f32 = 2.71;
}

impl FloatConst for f64 {
    const PI: f64 = 3.14159;
    const E: f64 = 2.71828;
}

fn f<T: FloatConst>(t: T) -> T {
    t + T::PI + T::E
}

fn main() {
    let x = 5.0f32;
    println!("Result: {}", f(x));
}
Run Code Online (Sandbox Code Playgroud)

在以前版本的Rust中,您将需要使用以下函数:

extern crate num;

use num::traits::Float;

trait FloatConst {
    fn pi() -> Self;
}

impl FloatConst for f32 {
    fn pi() -> Self { std::f32::consts::PI }
}

impl FloatConst for f64 {
    fn pi() -> Self { std::f64::consts::PI }
}

fn f<T: Float + FloatConst>(t: T) -> T {
    T::pi() * t
}

fn main() {
    println!("Result: {}", f(5.0f32));
    println!("Result: {}", f(5.0f64));
}
Run Code Online (Sandbox Code Playgroud)

我希望单态化和编译器优化能够尽可能快地实现这一目标,但如果需要,分析总是一个好主意.