4 个版本
0.1.3 | 2021 年 12 月 27 日 |
---|---|
0.1.2 | 2021 年 12 月 27 日 |
0.1.1 | 2019 年 7 月 11 日 |
0.1.0 | 2019 年 5 月 10 日 |
在 Rust 模式 中排名 #730
每月下载量 36
用于 syllogism-macro
30KB
211 行
Syllogism
允许使用稳定 Rust 进行某些专业化的实用工具。
专业化是 正在开发的 rust 编程语言特性。
功能
该软件包提供两种专业化技术
- 使用
IsNot
特质。当您想为具体类型进行专业化时,可以使用此技术。 - 使用
Specialize
特质。当您想为类型参数进行专业化时,可以使用此技术。
这两种技术都需要大量的样板代码。 syllogism-macro
软件包提供了一些过程宏,可以为您生成这些样板代码。
请注意,该软件包只能用于某些类型的专业化,以下为示例。
项目状态
syllogism
和 syllogism-macro
是实验性软件包,并未真正积极维护。
专业化在 2019 年路线图 中被提及。 syllogism
和 syllogism-macro
软件包原本打算在专业化尚未在稳定 Rust 中提供时作为过渡期使用。截至 2021 年 8 月,专业化尚未稳定。
syllogism
软件包的动机是允许在其他软件包中实现某种设计。然而,结果证明这种设计过于复杂,并且不需要专业化的更简单、更好的设计。此外,ruma
软件包改变了设计,使得专业化不再需要(播客,41'30'')。
鉴于这些经验教训以及 2021 年 8 月专业化的状态,我们的建议如下
-
如果您想使用专业化来实现某种设计,请检查是否可以想出一个更简单的无需专业化的设计。也许您正在尝试过度抽象?专业化是许多面向对象语言中的常见功能,但众所周知,在一般情况下,面向对象设计模式并不很好地转换为 Rust。我们建议重新思考您的问题,也许可以涉及其他人参与设计讨论。
-
如果您想出于性能原因使用特化,请测试您将获得的性能提升。也许这样做不值得付出。
-
您可以使用
syllogism
和syllogism-macro
来验证您的设计或测试性能,但我们不建议将其视为结构化解决方案。 -
不能保证一旦特化在稳定版Rust中可用,
IsNot
和Specialize
特性可以在不使用样板代码和不使用syllogism-macro
crate 的宏的情况下实现。因此,如果您使用syllogism
或syllogism-macro
,我们建议不仅依赖syllogism
和syllogism-macro
crate,而且在自己的 crate 中有一个特性,可以在使用稳定版 Rust 并在用 nightly Rust 编译时启用特化特性标志的情况下有条件地编译您的 crate。
示例
使用 IsNot
特性
// One special implementation:
impl GenericTrait<SpecialDataType1> for MyStruct {
// ...
}
// Another special implementation:
impl GenericTrait<SpecialDataType2> for MyStruct {
// ...
}
// The generic implementation.
impl<T> GenericTrait<T> for MyStruct
where T: IsNot<SpecialDataType1> + IsNot<SpecialDataType2>{
// ...
}
使用 Specialize
特性
impl<T> GenericTrait<T> for MyStruct<T>
where T: Specialize<SpecialDataType> {
fn some_method(&self, param: T) {
match param.specialize() {
Distinction::Special(special) => {
// The special implementation.
},
Distinction::Generic(generic) => {
// The generic implementation.
}
}
}
}
贡献
我们欢迎以问题和合并请求的形式进行贡献。在提交合并请求之前,请先创建一个问题,以便您知道随后的合并请求是否可能被批准。
许可证
此 crate 在 MIT 许可证或 Apache 许可证(版本 2.0)下分发,由您选择。对于 MIT 许可证的适用,doc 注释中包含的示例不被视为“此软件的实质性部分”。