2 个版本
0.1.1 | 2021 年 9 月 5 日 |
---|---|
0.1.0 | 2021 年 9 月 1 日 |
#15 in #运算符重载
每月 30 次下载
用于 algeo
9KB
67 行
xops
Rust 用于运算符重载的过程宏。
许可证
根据以下之一许可
- Apache 许可证 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确说明,否则根据 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: A
和 b: 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>
来实现。另一方面,在数学中,人们更可能说加法是在A
和B
之间定义的;区别在于操作被视为更类似一等公民。xops的方法与后者的解释一致,在Rust允许的范围内。
依赖关系
~2MB
~43K SLoC