簡體   English   中英

Rust中具有有限已知類型的泛型函數?

[英]Generic functions in Rust with limited, known types?

我正在Rust中編寫一些代碼,它可以與f64f32

嘗試將其轉換為使用泛型函數非常復雜; 我需要在每次使用時聲明該類型的功能。

在實踐中,我只希望使用f32f64 有沒有辦法編寫僅適用於一組已知類型的泛型函數?

我意識到這有點違背泛型函數。

只需使用num Crate中的Float特性即可 f32f64您將擁有所需的任何東西。 如果不需要,不要寫自己的特征。

只需將板條箱num-traits添加到Cargo.toml文件的[dependencies]部分中即可使用該特征:

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

想到的唯一工具是trait ,因此您的功能將是:

pub fn f<T: MyTrait>(x: T) {...}

然后,您可以實現MyTraitf32f64 這很接近,但有一個漏洞:調用者可以在自己的類型上實現該特征。 您不能通過將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
}

這可能並不理想,但是我可以通過使用特征和宏來實現。

例如,假設我們希望此函數采用f32f64

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
            }
        }
    );
}

然后我們調用f32f64的宏:

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

完整示例在這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM