#numbers #traits #type #upcast #cast

numtraits

适用于数字类型的实用特例

1 个不稳定版本

使用旧的 Rust 2015

0.0.1 2015年4月13日

#upcast 中排名第 7

MIT 许可证

6KB
60

此模块定义了一个特例 UpCastAs<T>,允许在原始类型之间进行提升转换(只有有意义且可以适应的类型才允许转换)。这些遵循简单的层次结构

f64 > f32 > u64 > u32 > u16 > u8
f64 > f32 > i64 > i32 > i16 > i8

有符号和无符号类型混合不好。你可以将这些视为隐含规则,例如,类型 UpCastAs<u64> 表示它可以从 u32 转换,因为 u64 > u32。在这个方案中,UpCastAs<f64> 表示它可以从 f64 转换,这意味着它可以从任何数字类型提升转换。

示例

cast 示例

fn example<T: UpCastAs<u32>>() {
    let _: T = cast(10u8);
    let _ = cast::<u8, T>(10u8); // Alternate syntax, uglier.
    let _: T = cast(10u16);
    let _: T = cast(10u32);
    let _: T = cast(10u64); // Error, u64 > u32
    let _: T = cast(10f32); // Error, f32 > u32
    let _: T = cast(10f64); // Error, f32 > u32
}

cast 只是对 UpCastAs::from 的一种薄包装

fn example<T: UpCastAs<u32>>() {
    let _: T = UpCastAs::from(10u8);
    let _: T = UpCastAs::from(10u16);
    // ...
}

您还可以直接从 T 调用,但 它不会遵循隐含规则,它只会识别从 V 的转换,如果 T: UpCastAs<V>,因此这 不建议

fn example<T: UpCastAs<u32>>() {
    let _ = T::from(10u16); // Error
    let _ = T::from(10u32);
    let _ = T::from(10u64); // Error.
}

没有运行时依赖