#泛型 #模式 #包装 #宏推导 #核心

无 std 放大

增强 Rust 语言功能:多个泛型特质的实现、类型包装、推导宏

103 个版本 (62 个稳定)

5.0.0-beta.12024 年 8 月 5 日
4.7.0 2024 年 8 月 5 日
4.6.0 2024 年 2 月 15 日
4.5.0 2023 年 10 月 9 日
0.1.8 2020 年 7 月 4 日

#54 in Rust 模式

Download history 4509/week @ 2024-05-04 2812/week @ 2024-05-11 3234/week @ 2024-05-18 2869/week @ 2024-05-25 3107/week @ 2024-06-01 2714/week @ 2024-06-08 3999/week @ 2024-06-15 4697/week @ 2024-06-22 3735/week @ 2024-06-29 3331/week @ 2024-07-06 4370/week @ 2024-07-13 3753/week @ 2024-07-20 5746/week @ 2024-07-27 5650/week @ 2024-08-03 5818/week @ 2024-08-10 5714/week @ 2024-08-17

23,338 每月下载量
用于 166 个 crate(118 个直接使用)

MIT 许可证

180KB
4K SLoC

Rust Amplify 库

Build Tests Lints codecov

crates.io Docs unsafe forbidden MIT licensed

增强 Rust 语言功能:多个泛型特质的实现、类型包装、推导宏。一个微小的库,没有非可选依赖。可以工作在 no_std 环境中。

最低支持的 Rust 编译器版本 (MSRV):1.75.0;rust 版本 2021。

主要特性

泛型

库提出了 泛型实现策略,允许实现多个泛型特质。

为泛型类型实现特质(“ blanket 实现”)超过一次(适用于本地和外部特质) - 或者在一个有 blanket 实现的上游中为具体类型实现外部特质。解决方案是使用 @Kixunil 的特殊模式。我在 src/strategy.rs 模块中广泛使用它。

有了这个辅助类型,您可以编写以下代码,这将为您提供对某些特质 SampleTrait 的多个高效 blanket 实现。

pub trait SampleTrait {
    fn sample_trait_method(&self);
}

// Define strategies, one per specific implementation that you need,
// either blanket or concrete
pub struct StrategyA;

pub struct StrategyB;

pub struct StrategyC;

// Define a single marker type
pub trait Strategy {
    type Strategy;
}

// Do a single blanket implementation using Holder and Strategy marker trait
impl<T> SampleTrait for T
    where
        T: Strategy + Clone,
        amplify::Holder<T, <T as Strategy>::Strategy>: SampleTrait,
{
    // Do this for each of sample trait methods:
    fn sample_trait_method(&self) {
        amplify::Holder::new(self.clone()).sample_trait_method()
    }
}

// Do this type of implementation for each of the strategies
impl<T> SampleTrait for amplify::Holder<T, StrategyA>
    where
        T: Strategy,
{
    fn sample_trait_method(&self) {
        /* ... write your implementation-specific code here */
    }
}

# pub struct ConcreteTypeA;

// Finally, apply specific implementation strategy to a concrete type
// (or do it in a blanket generic way) as a marker:
impl Strategy for ConcreteTypeA {
    type Strategy = StrategyA;
}

推导宏

  • 显示
  • 错误
  • 获取器
  • 作为任何
  • 包装器

宏可以完成的工作示例

#[derive(From, Error, Display, Debug)]
#[display(doc_comments)]
pub enum Error {
    // You can specify multiple conversions with separate attributes
    #[from(::std::io::Error)]
    #[from(IoError)]
    /// Generic I/O error
    Io,

    #[from]
    // This produces error description referencing debug representation
    // of the internal error type
    /// Formatting error: {_0:}
    Format(::std::fmt::Error),

    #[from]
    /// Some complex error, here are details: {details}
    WithFields { details: ::std::str::Utf8Error },

    #[display(LowerHex)]
    MultipleFields {
        // ...and you can also covert error type
        #[from(IoErrorUnit)]
        // rest of parameters must implement `Default`
        io: IoError,

        #[display(ToHex::to_hex)]
        details: String,
    },
}

更多信息请参阅 amplify_derive crate 的 README

  • none! 作为 Default::default() 在集合类型和那些语义上强调操作初始化空结构的类型上的别名。
  • s! 用于快速 &str -> String 转换
  • 生成集合的宏
    • 用于快速创建 HashMapBTreeMapmap!bmap!
    • 用于快速创建 HashSetBTreeSetset!bset!
    • 用于创建 LinkedListlist!

包装类型

包装特质帮助创建包装 Rust 新类型,包装类型用于允许在外国类型上实现外国特质:https://doc.rust-lang.net.cn/stable/rust-by-example/generics/new_types.html

特质定义了访问内部数据、构建和析构新类型的便捷方法。它还作为新类型的标记特质。

该特质与来自 amplify_derive 包的 #[derive(Wrapper)] 一起工作

构建

cargo build --all
cargo test

提醒一下,最低支持的 Rust 编译器版本 (MSRV) 是 1.36.0,因此可以使用 nightly、dev、stable 或 1.36+ 版本的 Rust 编译器进行构建。使用 rustup 获取正确版本,或将 +toolchain 参数添加到 cargo buildcargo test 命令中。

基准测试

RUSTFLAGS="--cfg bench" cargo bench

依赖关系

~0.3–1MB
~18K SLoC