#traits #macro-derive #derive #macro #procedural

无 std symm_impl

自动实现对称特质的属性宏

3 个版本

0.1.2 2021 年 2 月 21 日
0.1.1 2021 年 2 月 21 日
0.1.0 2021 年 2 月 21 日

#1697 in Rust 模式

每月 35 次下载

MIT/Apache

22KB
195

自动实现对称特质的属性宏

crate Docs Apache2/MIT licensed Build Status

[dependencies]
symm_impl = "0.1"

示例

use symm_impl::symmetric;

trait Distance<Other> {
    fn distance(&self, other: &Other) -> f64;
}
struct Point2D {
    x: f64,
    y: f64,
}
struct Disk {
    center: Point2D,
    radius: f64
}
impl Distance<Point2D> for Point2D {
    fn distance(&self, other: &Point2D) -> f64 {
        let dx = self.x - other.x;
        let dy = self.y - other.y;
        (dx * dx + dy * dy).sqrt()
    }
}
#[symmetric]
impl Distance<Disk> for Point2D {
    fn distance(&self, other: &Disk) -> f64 {
        let p_diff = self.distance(&other.center);
        if p_diff.le(&other.radius) {
            0.0_f64
        } else {
            p_diff - other.radius
        }
    }
}
/* Expands to
impl Distance<Point2D> for Disk {
    #[allow(unused_mut)]
    #[inline]
    fn distance(&self, other: &Point2D) -> f64 {
        <Point2D as Distance>::distance(other, self)
    }
}
*/

详细信息

在计算几何(以及可能的其他领域)中,两个不同类型之间具有对称的二进制运算符是常见的。例如,两个不同形状之间的距离,以及两个不同形状之间的交点。在这些情况下,人们期望只需要实现一个方向的运算符,并自动推导出另一个方向的运算符。

此属性宏自动实现实现的“镜像”版本,以节省一些按键并使代码看起来更简洁。

要使特质具有对称性,必须满足以下属性

  • 特质必须是泛型的,第一个非生命周期参数是对称的类型。
  • 特质中的所有方法都必须恰好接受两个参数,其中第一个参数是接收器(self&self&mut self)和其他参数是对称的类型。这两个参数在意义上必须属于同一系列,即它们都应该或都不应该是引用或可变。

许可证

根据您的选择,许可如下

依赖项

~1.5MB
~34K SLoC