3 个版本
0.1.2 | 2021 年 2 月 21 日 |
---|---|
0.1.1 | 2021 年 2 月 21 日 |
0.1.0 | 2021 年 2 月 21 日 |
#1697 in Rust 模式
每月 35 次下载
22KB
195 行
自动实现对称特质的属性宏
[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