[英]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.