在Rust中创建一个newtype float的简单方法?

xqkwcwgp  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(122)

rust文档中提到了newtype的习惯用法,我想把它用在float上:struct MyFloat(f32)。然而,将其用作浮点数可能有点麻烦。我以为我已经在num-derive crate中找到了解决方案,但它不起作用:

#[derive(num_derive::Float)]
struct MyFloat(f32);

在Rust Explorer中
这些行会导致许多关于未实现的traits Neg、NumCast等的错误。
我还需要别的东西才能让它工作吗

jtoj6r0c

jtoj6r0c1#

Float trait有一些supertrait,num_derive::Float没有实现它们,只有Float本身。幸运的是,num-derive也为它们提供了#[derive] s:

#[derive(
    Clone,
    Copy,
    PartialEq,
    PartialOrd,
    num_derive::Float,
    num_derive::Num,
    num_derive::NumCast,
    num_derive::Zero,
    num_derive::One,
    num_derive::NumOps,
    num_derive::ToPrimitive,
)]
struct MyFloat(f64);

不幸的是,这仍然会出错,因为Neg是必需的,但尚未实现。您可以手动实现它:

impl std::ops::Neg for MyFloat {
    type Output = MyFloat;

    fn neg(self) -> Self::Output {
        Self(-self.0)
    }
}

相关问题