如何重载自定义类型的“ as”运算符?

Dav*_*ams 2 casting rust

我有两个简单的类,分别代表四个int和四个float。我想重载“ as”运算符,以便我可以轻松地将一个转换为另一个。这应该通过分别转换每个元素来完成。到目前为止,我有:

#[derive(Copy, Clone)]
pub struct i32x4 {
    pub x: i32,
    pub y: i32,
    pub z: i32,
    pub w: i32
}

#[derive(Copy, Clone)]
pub struct f32x4 {
    pub x: f32,
    pub y: f32,
    pub z: f32,
    pub w: f32
}

impl f32x4 {    
    pub fn as_i32x4(&mut self) -> i32x4 {
        i32x4{x: self.x as i32, y: self.y as i32, z: self.z as i32, w: self.w as i32}
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以让我做:

let mut f = f32x4{x: 0.0, y: 0.0, z: 0.0, w: 0.0};
let i = f.as_i32x4(); // <-- Using my conversion function
Run Code Online (Sandbox Code Playgroud)

但是我想做:

let mut f = f32x4{x: 0.0, y: 0.0, z: 0.0, w: 0.0};
let i = f as i32x4; // <-- Using the 'as' operator
Run Code Online (Sandbox Code Playgroud)

这使:

错误:非标量转换:simd::f32x4assimd::i32x4

是否可以获得我希望的语法?我在“ std :: convert ”中发现了一些特征(AsRef,AsMut,From,Into),但是我不清楚它们是否是我想要的?

谢谢!

PS我知道管道中有真正的SIMD功能,但是它还不稳定,因此我只是在自己的类中进行模拟。和学习,显然;-)

DK.*_*DK. 5

你不能超载as

如果要以某种合理的标准方式表示“转换”,则需要实现您指定的一个或多个特征。特别:

  • AsMut/ AsRef:这种类型的指针和其他类型的指针可以安全地互换(完全相同的二进制布局和不变式)。
  • From/ Into:可以在此类型和其他类型之间进行转换而不会出现故障或出现其他上下文(两种类型都是相同的“事物”,只是表达/编码/类型不同)。

老实说,我不确定您期望的是什么语义。还有一个conv箱子定义了其他一些特征:

免责声明:我是上述conv板条箱的作者。

  • ApproxFrom/ ApproxInto:可以通过一种或多种近似方案将一种类型的值转换为另一种类型。
  • ValueFrom/ ValueInto大多数情况下,一种类型的值可以在不丢失信息的情况下转换为另一种类型(存在失败的可能性)。
  • TryFrom/ TryInto:一种类型的值可能会以某种方式转换为其他类型(尽力而为的转换)。

取决于您要执行的操作,ApproxFrom/ ApproxInto最有意义的是转换值(可能需要四舍五入),如果要执行float运算符,则AsMut/ AsRef是可辩护的。