1 个不稳定版本
使用旧的 Rust 2015
0.0.1 | 2015年4月13日 |
---|
在#upcast 中排名第 7
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.
}