#专业化 #专化 #稳定 #特质 # #参数 #样板

syllogism

允许使用稳定 Rust 进行某些专业化的实用工具

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

MIT/Apache

30KB
211

Syllogism

允许使用稳定 Rust 进行某些专业化的实用工具。

专业化是 正在开发的 rust 编程语言特性

功能

该软件包提供两种专业化技术

  • 使用 IsNot 特质。当您想为具体类型进行专业化时,可以使用此技术。
  • 使用 Specialize 特质。当您想为类型参数进行专业化时,可以使用此技术。

这两种技术都需要大量的样板代码。 syllogism-macro 软件包提供了一些过程宏,可以为您生成这些样板代码。

请注意,该软件包只能用于某些类型的专业化,以下为示例。

项目状态

syllogismsyllogism-macro 是实验性软件包,并未真正积极维护。

专业化在 2019 年路线图 中被提及。 syllogismsyllogism-macro 软件包原本打算在专业化尚未在稳定 Rust 中提供时作为过渡期使用。截至 2021 年 8 月,专业化尚未稳定。

syllogism 软件包的动机是允许在其他软件包中实现某种设计。然而,结果证明这种设计过于复杂,并且不需要专业化的更简单、更好的设计。此外,ruma 软件包改变了设计,使得专业化不再需要(播客,41'30'')。

鉴于这些经验教训以及 2021 年 8 月专业化的状态,我们的建议如下

  1. 如果您想使用专业化来实现某种设计,请检查是否可以想出一个更简单的无需专业化的设计。也许您正在尝试过度抽象?专业化是许多面向对象语言中的常见功能,但众所周知,在一般情况下,面向对象设计模式并不很好地转换为 Rust。我们建议重新思考您的问题,也许可以涉及其他人参与设计讨论。

  2. 如果您想出于性能原因使用特化,请测试您将获得的性能提升。也许这样做不值得付出。

  3. 您可以使用 syllogismsyllogism-macro 来验证您的设计或测试性能,但我们不建议将其视为结构化解决方案。

  4. 不能保证一旦特化在稳定版Rust中可用,IsNotSpecialize 特性可以在不使用样板代码和不使用 syllogism-macro crate 的宏的情况下实现。因此,如果您使用 syllogismsyllogism-macro,我们建议不仅依赖 syllogismsyllogism-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 注释中包含的示例不被视为“此软件的实质性部分”。

无运行时依赖