如果我知道它可能的话,如何将通用T转换为f32?

时间:2016-03-03 07:56:26

标签: generics rust

我的通用struct包含一个字段,只能是i32f32

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);
}

2 个答案:

答案 0 :(得分:3)

你是对的,as仅适用于具体类型。

使用FromInto特征进行转换是一种很好的方法,但这些方法并未针对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
    }
}