我想在Rust中编写通用数学代码。类型f32
和f64
已经定义了常量。例如。 π是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));
}
的产率:
main.rs:6:5: 6:18 error: associated type `consts` not found for `T` [E0220]
main.rs:6 T::consts::PI * t
^~~~~~~~~~~~~
如果无法做到这一点,那么如何使用通用类型T
访问数学常量?
答案 0 :(得分: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));
}
在以前版本的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));
}
我希望单态化和编译器优化能够尽可能快地实现这一目标,但如果需要,分析总是一个好主意。