[英]Generic functions in Rust with limited, known types?
我正在Rust中编写一些代码,它可以与f64
和f32
。
尝试将其转换为使用泛型函数非常复杂; 我需要在每次使用时声明该类型的功能。
在实践中,我只希望使用f32
和f64
。 有没有办法编写仅适用于一组已知类型的泛型函数?
我意识到这有点违背泛型函数。
只需使用num Crate中的Float
特性即可 。 仅 f32
和f64
您将拥有所需的任何东西。 如果不需要,不要写自己的特征。
只需将板条箱num-traits
添加到Cargo.toml文件的[dependencies]
部分中即可使用该特征:
[dependencies]
# ...
num-traits = "0.1"
想到的唯一工具是trait
,因此您的功能将是:
pub fn f<T: MyTrait>(x: T) {...}
然后,您可以实现MyTrait
为f32
和f64
。 这很接近,但有一个漏洞:调用者可以在自己的类型上实现该特征。 您不能通过将MyTrait
私有来解决此问题,因为Rust随后抱怨您在公共界面中使用了私有类型( MyTrait
)。
如此接近,但我认为这是完全不可能的!
尽管我同意关于使用现有相关特征的其他答案,但是您可以这样做:
mod foo {
pub trait MyTrait {}
impl MyTrait for f32 {}
impl MyTrait for f64 {}
pub fn f<T: MyTrait>(x: T) {}
}
pub fn main() {
foo::f(3f32);
foo::f(3f64);
// foo::f(3u64); // doesn't work as u64 doesn't implement MyTrait
}
这可能并不理想,但是我可以通过使用特征和宏来实现。
例如,假设我们希望此函数采用f32
或f64
:
fn sqr(a: f32) -> f32 {
a * a
}
我们首先可以将其置于特征中:
trait Sqr {
fn sqr(self) -> Self;
}
然后我们创建一个宏来实现它。 宏只接受一个类型,并实现该类型的特征:
macro_rules! impl_sqr {
($t:ty) => (
impl Sqr for $t {
fn sqr(self) -> Self {
self * self
}
}
);
}
然后我们调用f32
和f64
的宏:
impl_sqr!(f32);
impl_sqr!(f64);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.