Rust 中具有有限已知类型的通用函数?

ide*_*n42 7 generics types rust

f64我正在用 Rust 编写一些代码,这些代码可以与和一起工作f32

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

在实践中,我只想f32f64利用。有没有一种方法可以编写仅适用于一组已知类型的泛型函数?

我意识到这有点违背通用功能。

Chr*_*son 3

为此想到的唯一工具是 a trait,因此您的函数将是:

pub fn f<T: MyTrait>(x: T) {...}
Run Code Online (Sandbox Code Playgroud)

然后您可以实现MyTraitforf32f64。这很接近,但有一个漏洞:调用者可以在自己的类型上实现该特征。你无法通过设为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
}
Run Code Online (Sandbox Code Playgroud)