2 个版本

0.1.1 2021 年 9 月 5 日
0.1.0 2021 年 9 月 1 日

#15 in #运算符重载

每月 30 次下载
用于 algeo

MIT/Apache 许可证

9KB
67

xops

Crate API

Rust 用于运算符重载的过程宏。

许可证

根据以下之一许可

由您选择。

贡献

除非您明确说明,否则根据 Apache-2.0 许可证定义,您有意提交的任何贡献,均应双许可如上,无需任何额外条款或条件。


lib.rs:

帮助重载运算符的过程宏。

关于

xops = eX(tra/tended/cellent) + OPerat(or/ion) + S

此crate提供了实现与给定操作实现相关的操作族的宏。

用法/示例

请参阅 binop

运算符重载基础

std::ops 中的所有运算符重载特质遵循一个共同的模式。例如,考虑用于重载 + 运算符的 Add 特质;其特质定义如下

trait Add<Rhs = Self> {
    type Output;
    fn add(self, rhs: Rhs) -> Self::Output;
}

接收类型 Self+ 运算符的左侧,而泛型类型参数 Rhs 是右侧。为 A 实现 Add<B> 将使表达式 a + b 等价于 <A as Add<B>>::add(a, b),对于任何 a: Ab: B

关于这些特性的实现示例,请参阅std::ops

讨论

xops的功能与其它'derive'crate非常相似,自动推导特性格式。然而,与将属性放置在结构体、枚举或联合体(如derive属性)不同,xops的属性放置在特性格式实现上,即形式为impl Trait for Type { ... }的项。

将属性放在特性格式实现上的原因既具有实用主义成分,也具有语义成分

  • 从特性格式实现来看,xops可以直接解析它完成工作所需的所有信息,即类型、特性和方法标识符。如果xops使用derive宏,所有这些信息要么需要用户提供,要么xops需要有关所有标准库操作的一些目录。然而,在当前的方法中,您甚至不限于仅限于标准库操作,xops可以在具有相同布局的任何特性格式上工作。(尽管,Rust不支持自定义操作重载,因此可能没有多少用途超出标准库操作)。

  • 在Rust中,当我们为Add<B>实现A时,我们实际上是在说A可以与B进行加法运算,这与B可以与A进行加法运算有细微的差别,我们可以通过为B实现Add<A>来实现。另一方面,在数学中,人们更可能说加法是在AB之间定义的;区别在于操作被视为更类似一等公民。xops的方法与后者的解释一致,在Rust允许的范围内。

依赖关系

~2MB
~43K SLoC