我想创建一个只接受拥有某种方法的类型的函数。例如,我知道
f32
和 f64
原始类型拥有 log10
方法,因此我想要一个只接受这些类型的函数。我想到的一种方法是为 f32
和 f64
实现一个特征,其中包含一个本身会调用 log10
的函数,例如,
trait Log10 {
fn log10_t(&self) -> f64;
}
impl Log10 for f32 {
fn log10_t(&self) -> f64 {
self.log10() as f64
}
}
impl Log10 for f64 {
fn log10_t(&self) -> f64 {
self.log10()
}
}
然后我可以有一个只接受实现
Log10
的类型的函数,例如,
fn my_log10<T: Log10>(f: T) -> f64 {
f.log10_t() as f64
}
这可行,但我想知道是否有更好/更简单的方法?例如,不需要我实现中间
log10_t
函数。或者,实际上仍然可以将输出保持为输入值的类型(我的方法将输出转换为 f64
,无论输入类型如何)。
使用特质是正确的方法。您可以使用宏来减少样板文件。另请注意,无需将方法命名为
log10_t()
,您可以将其命名为 log10()
。
num-traits
箱,它定义了 std 中几乎每个数字方法的特征。它们还支持非标准类型,例如 num-bigint
。例如,它使用 Float
方法定义 log10()
。
函数签名可以这样简化:
fn my_log10(f: impl Log10) -> f64 {
f.log10_t()
}