103 个版本 (62 个稳定)
5.0.0-beta.1 | 2024 年 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 模式
23,338 每月下载量
用于 166 个 crate(118 个直接使用)
180KB
4K SLoC
Rust Amplify 库
增强 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
转换- 生成集合的宏
- 用于快速创建
HashMap
和BTreeMap
的map!
及bmap!
- 用于快速创建
HashSet
和BTreeSet
的set!
及bset!
- 用于创建
LinkedList
的list!
- 用于快速创建
包装类型
包装特质帮助创建包装 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 build
和 cargo test
命令中。
基准测试
RUSTFLAGS="--cfg bench" cargo bench
依赖关系
~0.3–1MB
~18K SLoC