实现一个 Rust 函数,只接受拥有某种方法的类型

问题描述 投票:0回答:2

我想创建一个只接受拥有某种方法的类型的函数。例如,我知道

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
,无论输入类型如何)。

rust traits
2个回答
2
投票

使用特质是正确的方法。您可以使用宏来减少样板文件。另请注意,无需将方法命名为

log10_t()
,您可以将其命名为
log10()

在数字方法的这种特定情况下,您可以使用

num-traits
箱,它定义了 std 中几乎每个数字方法的特征。它们还支持非标准类型,例如
num-bigint
。例如,它使用
Float
方法定义
log10()


0
投票

函数签名可以这样简化:

fn my_log10(f: impl Log10) -> f64 {
    f.log10_t()
}
© www.soinside.com 2019 - 2024. All rights reserved.