rust - Rust中不同整数类型的函数参数

标签 rust constraints overloading traits

如果 Rust 支持两个 percent 函数,我将如何执行以下操作?

fn percent(x: u8) -> f32 {
    x as f32 / 100.0
}
fn percent(x: u16) -> f32 {
    x as f32 / 100.0
}

如果我尝试使用如下所示的通用数据类型:

fn percent<T>(x: T) -> f32 {
    x as f32 / 100.0
}

我收到错误

non-primitive cast: T as f32

我可以用某种整数特征来约束 T 吗?

最佳答案

如果您只想支持 u8u16 类型,则:

fn percent<T: Into<f32>>(x: T) -> f32 {
    x.into() / 100.0
}

就足够了,因为u8u16都可以无损地转换为f32。如果您想进行一般转换,例如将 u64 转换为 f64,这可能会导致精度损失,您可以使用 ApproxInto来自 conv 的特征。

fn percent<T: ApproxInto<f64>>(x: T) -> Result<f64, T::Err> {
    x.approx_into().map(|v| v / 100.0)
}

关于rust - Rust中不同整数类型的函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60663864/

相关文章:

rust - 操作二维字符串向量时的最佳实践是什么?

rust - 无法在适用于 Linux 的 Windows 子系统上使用 Rust 1.25 构建 actix-web 0.7.8

c# - 为什么在测试受约束的泛型类型时直接转换失败但 "as"运算符成功?

php - Laravel Eloquent 截断 - 外键约束

ios - UIView 高度在较大的设备上拉伸(stretch) IOS

delphi - 为什么仅在将重载过程分配给局部变量后才使用重载过程时会出现 'H2219 Private symbol X declared but never used'?

java - 在 Ruby 中重载 protected 和私有(private)方法

string - 接受任何类型的字符串并将其视为不可变字符串并生成新的不可变字符串的 Rust 方法?

java - 改变java中子类方法的语义

rust - 具有定制包装类型的柴油机