Generics Rust中具有有限已知类型的泛型函数?

Generics Rust中具有有限已知类型的泛型函数?,generics,types,rust,Generics,Types,Rust,我正在用Rust编写一些代码,这些代码同样适用于f64和f32 试图将其转换为使用泛型函数是相当复杂的;我需要在每次使用时声明该类型的功能 实际上,我只希望使用f32和f64。有没有一种方法可以编写只适用于一组已知类型的泛型函数 我意识到这有点违背了一般函数。想到这一点的唯一工具是特性,因此您的函数是: pub fn f<T: MyTrait>(x: T) {...} 就用吧。您将拥有所有您需要的f32和f64仅。如果你真的不需要,就不要写你自己的特点 只需将板条箱num trai

我正在用Rust编写一些代码,这些代码同样适用于
f64
f32

试图将其转换为使用泛型函数是相当复杂的;我需要在每次使用时声明该类型的功能

实际上,我只希望使用
f32
f64
。有没有一种方法可以编写只适用于一组已知类型的泛型函数


我意识到这有点违背了一般函数。

想到这一点的唯一工具是
特性,因此您的函数是:

pub fn f<T: MyTrait>(x: T) {...}
就用吧。您将拥有所有您需要的
f32
f64
。如果你真的不需要,就不要写你自己的特点

只需将板条箱
num traits
添加到Cargo.toml文件的
[dependencies]
部分,即可使用该traits:

[dependencies]
# ...
num-traits = "0.1"

这可能并不理想,但我通过使用trait和宏来实现这一点

例如,假设我们希望此函数采用
f32
f64

fn sqr(a:f32)->f32{
a*a
}
我们可以先把它放在一个特征中:

trait-Sqr{
fn sqr(自我)->自我;
}
然后我们制作一个宏来实现它。宏只接受一个类型,并实现该类型的特征:

macro\u规则!impl_sqr{
($t:ty)=>(
impl Sqr为$t{
fn sqr(自我)->自我{
自我,自我
}
}
);
}
然后调用
f32
f64
的宏:

impl_sqr!(f32);
impl_sqr!(f64);

仅适用于
f32
f64
两种情况-这仅适用于特定时间点和特定板条箱。任何人都完全有可能实现一个实现
Float
特征的类型,并将其传递到函数中。实际上,我认为定制特征可能更好,具体取决于上下文。这完全取决于如何使用该值以及需要什么样的方法。一个自定义特征只是一种表现形式。执行
fn sqr(x:T)->T{x*x}
errors out会给出
error:binary operation`*`不能应用于'T`
类型。您还需要指定T需要实现哪些其他特征,例如
T:MyTrait+Mul
,以允许乘法。
[dependencies]
# ...
num-traits = "0.1"