我的通用struct
包含一个字段,只能是i32
或f32
。
trait MyInt {
fn blank();
}
impl MyInt for i32 {
fn blank() {
unimplemented!()
}
}
impl MyInt for f32 {
fn blank() {
unimplemented!()
}
}
struct MyStruct<T> where T: MyInt {
field: T
}
impl<T> MyStruct<T> where T: MyInt {
fn new(var: T) -> MyStruct<T> {
MyStruct {
field: var
}
}
}
现在我想添加一个返回字段值as f32
的方法,无论是i32
还是f32
。我知道这个演员阵容应该永远是可能的,因为场地类型仅限于上面提到的两个,但我该怎么做呢?显然as
仅适用于原始类型,我尝试使用From
路线,但我做错了,这不起作用。
fn to_f32(&self) -> f32 where T: From<i32> {
f32::from(self.field);
}
答案 0 :(得分:3)
你是对的,as
仅适用于具体类型。
使用From
或Into
特征进行转换是一种很好的方法,但这些方法并未针对i32实施 - &gt; f32转换。 Matthieu M.说,原因很可能是潜在的有损转换。
您必须使用f64
代替f32
。
我建议将这个特性改为:
trait MyInt: Copy + Into<f64> {
fn blank();
}
然后您可以添加方法来进行转换:
fn to_f64(&self) -> f64 {
self.field.into()
}
答案 1 :(得分:2)
您只需将演员表添加为MyInt
特征的方法:
trait MyInt {
fn to_f32_lossy(self) -> f32;
}
impl MyInt for i32 {
fn to_f32_lossy(self) -> f32 {
self as f32
}
}
impl MyInt for f32 {
fn to_f32_lossy(self) -> f32 {
self
}
}