使用泛型时如何使用浮点数文字?
How do I use floating point number literals when using generic types?
常规浮点文字不起作用:
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}`
您不能直接从文字创建 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()
}
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
traits
fn scale_float<T>(x: T) -> T
where
T: Float,
f64: Into<T>
{
x * 0.54.into()
}
另请参阅:
在某些情况下,您可以添加一个限制,即泛型类型必须能够与文字类型相乘。在这里,我们允许任何可以乘以 f64
的类型,只要它通过特征绑定 Mul<f64, Output = T>
:
产生 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);
}
这可能无法直接解决原始问题,但可能取决于您需要使用的具体类型。
如今,numeric_literals
crate 及其 replace_float_literals
功能有助于对复杂代码进行必要的替换。
常规浮点文字不起作用:
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}`
您不能直接从文字创建 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()
}
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
traits
fn scale_float<T>(x: T) -> T
where
T: Float,
f64: Into<T>
{
x * 0.54.into()
}
另请参阅:
在某些情况下,您可以添加一个限制,即泛型类型必须能够与文字类型相乘。在这里,我们允许任何可以乘以 f64
的类型,只要它通过特征绑定 Mul<f64, Output = T>
:
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);
}
这可能无法直接解决原始问题,但可能取决于您需要使用的具体类型。
如今,numeric_literals
crate 及其 replace_float_literals
功能有助于对复杂代码进行必要的替换。